plist不会拉进我的NSMutableArray。我错过了什么吗?

时间:2013-02-28 13:20:34

标签: objective-c xcode nsmutablearray plist nsmutabledictionary

所以这是我的代码。我正在尝试将plist中的内容显示到表中,并且我一直遇到错误。我整天都在这,所以我可能会错过一些相当容易的东西。希望你们能弄清楚为什么当我建造时,桌子是空的。

这是我的plist(没有标题):

<array>
<dict>
    <key>word</key>
    <string>AWord1</string>
    <key>definition</key>
    <string>here is a definition</string>
    <key>partOfSpeech</key>
    <string>here is a part of speech</string>
</dict>
<dict>
    <key>word</key>
    <string>Bword1</string>
    <key>definition</key>
    <string>here is a definition</string>
    <key>partOfSpeech</key>
    <string>here is a part of speech</string>
</dict>
</array>
</plist>

编辑:由于格式错误而导致结束标记丢失 - 已修复

确定。这是我的新代码。我NSLog'd并决定在我去plist之前回来。所以,如果你能提供帮助的话。您如何建议我从plist中提取此数据(假设数据在plist中)

//Initialize the array.
listOfItems = [[NSMutableArray alloc] init];

NSArray *countriesToLiveInArray = [NSArray arrayWithObjects:@"Iceland", @"Greenland", @"Switzerland", @"Norway", @"New Zealand", @"Greece", @"Italy", @"Ireland", nil];
NSDictionary *countriesToLiveInDict = [NSDictionary dictionaryWithObject:countriesToLiveInArray forKey:@"Countries"];

NSArray *countriesLivedInArray = [NSArray arrayWithObjects:@"India", @"U.S.A", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", @"Test", nil];
NSDictionary *countriesLivedInDict = [NSDictionary dictionaryWithObject:countriesLivedInArray forKey:@"Countries"];

[listOfItems addObject:countriesToLiveInDict];
[listOfItems addObject:countriesLivedInDict];

//Initialize the copy array.
copyListOfItems = [[NSMutableArray alloc] init];

//Set the title
self.navigationItem.title = @"Countries";

//Add the search bar
self.tableView.tableHeaderView = searchBar;
searchBar.autocorrectionType = UITextAutocorrectionTypeNo;

searching = NO;
letUserSelectRow = YES;

我觉得好像我还没有告诉它解析plist中的数据。我只是初学了。想法?

2 个答案:

答案 0 :(得分:1)

你的代码似乎非常不完整,它与plist没有多大关系。以下是一些问题

  • 正如H2CO3和Fogmeister所指出的那样,你所展示的plist缺少一个结束</array>标签(但我们假设这是问题中的拼写错误)
  • 将整个数组加载到countriesToLiveIn字典中的单个条目中(针对关键字“定义”)
  • countriesToLiveIn成为数组listOfItems
  • 中的单个对象
  • 您初始化一个copyOfListItems数组,但之后不对其执行任何操作

然后你没有指出表格从哪里得到它的日期。

如果它来自copyOfListItems,那么该数组是空的。:空表。

如果来自listOfItems,你将以某种方式解析countriesToLiveIn字典,但是你没有说明如何。

如果它直接来自plist数组countriesToLiveInArray,那么缺少</array>标记可能是一个线索。您还需要以某种方式解析数组包含的字典,并且您没有向我们展示该代码,那里可能存在问题。

为了进一步了解这一点,我建议大量使用NSLog来了解数据进入对象的距离。如果你仍然陷入困境,也许你可以用结果扩展你的问题。

<强>更新

根据您更新的代码,我首先怀疑您的网址存在问题。

在您之前的编辑中,这是可疑行

NSMutableArray *wordListArray = [[NSMutableArray alloc] initWithContentsOfURL: [NSURL URLWithString:@"http://url.com/dictpPlist.plist"]];

你需要在它之后立即使用NSLog:

NSLog (@"wordListArray %@", wordListArray);

确认您没有在这里拿起plist。至少那时我们在你的代码中将问题隔离到了这一点。

然后我们需要质疑网址 - 它是否正确?那个plist是怎么到达那里的?你可以独立验证吗?它是本地文件URL还是网络URL?

如果您正在访问网络资源,这很可能是您的问题。 initWithContentsOfURL方法应该只与本地文件系统URL一起使用。参见例如

initwithcontentsofurl methods considered harmful

您应该异步使用NSURLConnection。 Apple是a little cagey about this also

  

aURL :包含由writeToURL:atomically:方法生成的数组的字符串表示形式的文件的位置。

假设这是您的问题,为什么不首先使用本地文件系统plist。

listOfItems数组的代码中写一个:

- (void) createPlist
{
    NSFileManager* fManager = [NSFileManager defaultManager];
    NSError* error;
    NSURL* docsURL = [fManager URLForDirectory:NSDocumentDirectory 
                                          inDomain:NSUserDomainMask 
                                 appropriateForURL:nil 
                                            create:NO 
                                             error:&error];

    NSURL* plistURL = [docsURL URLByAppendingPathComponent:@"testlist.plist"];
    [listOfItems writeToURL:plistURL atomically:YES];
}

重新阅读,验证它是否有效,然后理清如何通过网络进行相同操作。

答案 1 :(得分:-2)

尝试以下代码

// Path to the plist (in the application bundle)
     NSString *path = [[NSBundle mainBundle] pathForResource:
    @"dictpPlist" ofType:@"plist"];

// Build the array from the plist  
     NSMutableArray *array2 = [[NSMutableArray alloc] initWithContentsOfFile:path];

// Show the string values  
    for (NSString *str in array2)
      NSLog(@"--%@", str);