从 plist 读取而不是代码数组:[NSCFArray objectForKey:]: unrecognized selector

Posted

技术标签:

【中文标题】从 plist 读取而不是代码数组:[NSCFArray objectForKey:]: unrecognized selector【英文标题】:Read from plist instead of Code array: [NSCFArray objectForKey:]: unrecognized selector 【发布时间】:2010-06-12 21:09:09 【问题描述】:

我正在使用教程(现在无法访问)“UITableView - 搜索表格视图”。

但我真的很难从 plist 中读取数据。

我所做的改变:

- (void)viewDidLoad 
    [super viewDidLoad];

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

    TableViewAppDelegate *AppDelegate = (TableViewAppDelegate *)[[UIApplication sharedApplication] delegate];
    listOfItems = [AppDelegate.data objectForKey:@"Countries"];

    //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;

这就是我从 My AppDelegate.m 中读取 plist 的方式

- (void)applicationDidFinishLaunching:(UIApplication *)application 

    NSString *Path = [[NSBundle mainBundle] bundlePath];
    NSString *DataPath = [Path stringByAppendingPathComponent:@"Data.plist"];

    NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:DataPath];
    self.data = tempDict;
    [tempDict release];


    // Configure and show the window
    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];

这是我的清单:

  <plist version="1.0">
<dict>
    <key>Countries</key>
    <array>
        <array>
            <string>USA</string>
        </array>
        <array>
            <string>UK</string>
        </array>
    </array>
</dict>
</plist>

我得到这个错误:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[NSCFArray objectForKey:]:无法识别的选择器已发送到实例 0xe09120”

【问题讨论】:

在您的 plist 中,在 项之后的 项在做什么? 不能在没有 的情况下运行 plist 【参考方案1】:

这会将一个新分配的可变数组分配给一个成员。

listOfItems = [[NSMutableArray alloc] init];

这会泄漏上述数组并将一个自动释放的、不可变的数组分配给该成员。

listOfItems = [AppDelegate.data objectForKey:@"Countries"];

稍后,当您访问 listOfItems 时,它可能已被释放。使用这个:

[listOfItems addObjectsFromArray:[AppDelegate.data objectForKey:@"Countries"]];

这一切都假定[AppDelegate.data objectForKey:@"Countries"] 正在返回一个数组。鉴于 plist,它应该,但值得仔细检查。

【讨论】:

当我使用 [listOfItems addObjectsFromArray:[AppDelegate.data objectForKey:@"Countries"]];它运行没有错误,但有空表 按照 plist,listOfItems 现在是一个数组数组。如果您需要一个字符串数组,请更改 plist。不过,这听起来像是一个新问题。 我花了 3 天时间试图弄清楚仍然无法得到我需要使用本教程 iphonesdkarticles.com/2009/01/… 从 plist 中读取的所有内容

以上是关于从 plist 读取而不是代码数组:[NSCFArray objectForKey:]: unrecognized selector的主要内容,如果未能解决你的问题,请参考以下文章

如何从 plist 数组中读取一个条目

使用 Xcode 读取和写入具有字典数组的 Plist

数组无法从 plist 中读取数据

如何从 plist iOS 中读取数组

Swift 中的 Array 扩展以使用 NSPropertyListReadOptions 从 plist 中读取数组

用触动怎么读取plist的数组?