• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iphone - UITableView 搜索后应用崩溃

[复制链接]
菜鸟教程小白 发表于 2022-12-12 22:31:23 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

如果我这样做,我的应用程序会崩溃:

  1. 我在我的 UITableView 上进行搜索

  2. 搜索后我点击 searchDisplayController UITableView 的 UITableViewCell 并转到另一个 View Controller

  3. 然后我回到主 UITableView,questionTable - 我在其中搜索的那个,然后点击最后一个单元格,或者任何大于搜索结果数量的单元格我以前有过。

  4. 应用程序因此错误而崩溃:

    *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 12 beyond bounds [0 .. 0]'
    *** First throw call stack0x35aa188f 0x37e48259 0x359ea9db 0x155fd 0x3384df5b 0x153ed 0x3358793d 0x33601627 0x355bb933 0x35a75a33 0x35a75699 0x35a7426f 0x359f74a5 0x359f736d 0x37693439 0x33503cd5 0x95a3 0x9548) terminate called throwing an exception(lldb) 
    

我怀疑问题出在我的代码上,因为搜索 UITableView 对我来说是一个新话题。我就是这样做的:

1.我的VC符合这些协议(protocol)

2.我有这些变量:

@property (nonatomic, retain) NSMutableArray *searchResults;
@property (nonatomic, copy) NSString *savedSearchTerm;

3。在 viewDidLoad 我设置了我搜索的 UITableView 的来源:

    self.questionList = [[NSArray alloc]
                     initWithObjects: MY OBJECTS HERE, nil];

if ([self savedSearchTerm])
{
    [[[self searchDisplayController] searchBar] setText:[self savedSearchTerm]];
}

4。我有这个 Action 来处理搜索:

- (void)handleSearchForTermNSString *)searchTerm
{
[self setSavedSearchTerm:searchTerm];

if ([self searchResults] == nil)
{
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [self setSearchResults:array];
}
[[self searchResults] removeAllObjects];

if ([[self savedSearchTerm] length] != 0)
{
    for (NSString *currentString in [self questionList])
    {
        if ([currentString rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound)
        {
            [[self searchResults] addObject:currentString];
        }
    }
}   
}

5) 以下是我设置 UITable View 的方法:

    (UITableViewCell *)tableViewUITableView *)tableView 
         cellForRowAtIndexPathNSIndexPath *)indexPath 
    {
    NSInteger row = [indexPath row];
    NSString *contentForThisRow = nil;

    if (tableView == [[self searchDisplayController] searchResultsTableView])
        contentForThisRow = [[self searchResults] objectAtIndex:row];
    else
        contentForThisRow = [[self questionList] objectAtIndex:row];

    static NSString *CellIdentifier = @"questionsCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [[cell textLabel] setText:contentForThisRow];
    return cell;
    }

6) 我的 numberOfRowsInSection 方法如下所示:

(NSInteger)tableViewUITableView *)tableView numberOfRowsInSectionNSInteger)section
{
NSInteger rows;

if (tableView == [[self searchDisplayController] searchResultsTableView])
rows = [[self searchResults] count];
else
rows = [[self questionList] count];
return rows;
}

7) 最后,我有这两种方法:

(BOOL)searchDisplayControllerUISearchDisplayController *)controller 
shouldReloadTableForSearchStringNSString *)searchString
{
    [self handleSearchForTerm:searchString];
    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

(void)searchDisplayControllerWillEndSearchUISearchDisplayController *)controller
{
    [self setSavedSearchTerm:nil];
    [[self questionTable] reloadData];
}

对于这个冗长的问题,我真的很抱歉。我在代码中犯了一些错误,我希望有人能告诉我正确的方法。搜索栏 Controller 在 IB 中正确链接 任何帮助将不胜感激!

新编辑: 我正在 didSelectRowAtIndePath 上推一个新的 VC:

- (void)tableViewUITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier"toAnswer" sender:indexPath];
}

我正在那里更新一个 NSString。当我只使用一个 TableView 时它工作得很好

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    ((QandADetailsViewController *)segue.destinationViewController).delegate=self;

    NSIndexPath *indexPath = (NSIndexPath *)sender;

    QandADetailsViewController *mdvc = segue.destinationViewController;

    if (self.searchResults == nil) {
        mdvc.questionName = [self.questionList
                             objectAtIndex:indexPath.row];
    } else {
        mdvc.questionName = [self.searchResults
                             objectAtIndex:indexPath.row];
    }
}



Best Answer-推荐答案


在为 segue 做准备时,对 searchResults == nil 的检查可能不正确。没有理由期望在第一次搜索后它会为零。这意味着您将始终在后续表选择中取消引用搜索数组,从而解释索引超出范围。

我认为解决方法是询问 if ([self.searchDisplayController isActive]) 而不是搜索结果是否存在。

关于iphone - UITableView 搜索后应用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12101116/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap