带有名称和描述 numberOfRowsInSection 问题的按字母顺序排列的 plist

Posted

技术标签:

【中文标题】带有名称和描述 numberOfRowsInSection 问题的按字母顺序排列的 plist【英文标题】:Alphabetical plist with name and description numberOfRowsInSection issues 【发布时间】:2014-05-28 16:36:21 【问题描述】:

所以,我有一个描述多种美食的 plist。在我的 plist 中,我有 26 个数组,每个数组都有一个字母键。在这些数组中,包含多个美食,它们是字典。在每个字典中有 2 个字符串,一个是菜的名称,另一个是菜的描述。我非常接近在表格视图控制器中实现这一点,但我遇到了一些问题。主要问题是访问名称并将其放入一个数组中,以便可以使用它来判断每个部分中有多少行,该部分是字母表中的每个字母。我不断收到错误消息:"-[_NSArrayI length]: unrecognized selector sent to instance...

非常感谢您的帮助。谢谢

这就是我所拥有的:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

        if (tableView.tag == 1)
            NSString *key = keys[section]; //returns the key(letter) for the section
            NSDictionary *content = cuisines[key]; //returns the dictionary that consists of name and description
            NSString *name = [content valueForKey:@"name"];
            NSMutableArray *keyValues = [@[] mutableCopy];
            [keyValues addObject:name];
            return [keyValues count];
        else
            return [filteredcuisines count];
        


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    if (tableView.tag == 1) 
        return [keys count]; //Return the amount of letters for the number of sections
    else
        return 1;
    

还有一张我的字典的图片: http://imageshack.com/a/img835/9567/kkv7.png

这是我的搜索条形码。我需要合并我对 plist 所做的更改。

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
    [filteredcuisines removeAllObjects];
    if (searchString.length>0) 
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", self.searchBar.text];
        for (NSString *key in keys) 
            NSArray *matches = [cuisines[key] filteredArrayUsingPredicate:predicate];
            [filteredcuisines addObjectsFromArray:matches];
        
    
    return YES;

【问题讨论】:

filtered cuisines 是用户键入要搜索的内容时搜索栏的过滤后的美食字典 您的钥匙和美食中有什么。它们都是数组吗? 哦,对不起,美食是包含一切的字典。 keys 是一个由字母 A-Z 组成的数组。每个字母都是一个数组,可以容纳多个字典,每个字典都可以代表一种美食。每个字典美食都有一个名称和描述。 你能发布 numberOfSections 方法吗? 另外,如果 tableView.tag==1,你似乎总是返回 1。总是 keyValues 将有一个对象。如果是这样,为什么需要所有这些操作? 【参考方案1】:

看起来你从美食[key] 获得的“内容”应该是一个数组,而不是字典。也不清楚你想用 keyValues 数组做什么。我认为您的方法可以简化为这样,

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

        if (tableView.tag == 1)
            NSString *key = keys[section]; 
            NSArray *content = cuisines[key];  
            return content.count;
        else
            return [filteredcuisines count];
        

我假设您通过在字典上调用 allKeys 来获取键,然后按字母顺序对其进行排序。如果是这样,那么您可以在 cellForRowAtIndexPath 中获取表格视图的名称,

    NSArray *arrayForSingleLetter = self.cuisines[keys[indexPath.section]];
    cell.textLabel.text = arrayForSingleLetter[indexPath.row][@"name"];

过滤你的数组必须修改成这样,

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
    [filteredcuisines removeAllObjects];
    if (searchString.length>0) 

        NSArray *arrayForSingleLetter = self.cuisines[[searchString substringToIndex:1]];
        NSIndexSet *indxs = [arrayForSingleLetter indexesOfObjectsPassingTest:^BOOL(NSDictionary *dict, NSUInteger idx, BOOL *stop) 
            return [dict[@"name"] rangeOfString:searchString].location != NSNotFound;
        ];

        [indxs enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) 
            [filteredcuisines addObject:arrayForSingleLetter[idx][@"name"]];
        ];
    
    return YES;

【讨论】:

这确实有效,它不允许我访问名称并将它们放在表格视图中。如何设置文本,如: cell.textLabel.text = content[indexPath.row];不起作用。这是在我的 cellForRowAtIndexPath 方法中 @leeferfeefer,这当然行不通,您必须使用 indexPath.section 获取各个部分,然后使用 indexPath.row 获取数组中的各个字典,最后使用 objectForKey: @"name" 获取名称。我已经更新了我的答案,向您展示如何做到这一点。 非常感谢。这是有道理的。我没有正确地接近这个 如何正确使用搜索栏。我已经编辑了我上面的问题。这是我在更新我的 plist 以获得描述之前所拥有的。 @leeferfeefer,这取决于您要执行的搜索类型。你想只搜索美食的名称吗?

以上是关于带有名称和描述 numberOfRowsInSection 问题的按字母顺序排列的 plist的主要内容,如果未能解决你的问题,请参考以下文章

带有字体名称和粗体的 UITextView 格式

NSFetchedResultsController 带有部分名称 KeyPath 和结果顺序

带有名称和邮件范围的 ASAuthorizationAppleIDRequest 返回 nil 值

从 XElement 创建带有名称空间和模式的 XML

jQuery 如何选择带有名称和属性的 HTML 输入?

使用AngularJS在GMT中显示带有地点和时间名称的时区