UITableView搜索后iOS应用程序冻结

时间:2013-09-29 02:46:04

标签: iphone ios objective-c uitableview

我是iOS开发的初学者,我很难找到导致此问题的原因。

我有一个带有Master和DetailView控制器的简单应用程序。主视图包含带有SearchController的UITableView。选择UITableView上的任何行都将转换为detailview。

当我执行以下序列时,应用会冻结

  1. 启动应用
  2. 下拉搜索栏
  3. 输入文字
  4. 从搜索结果中选择一行
  5. 从详细信息视图中选择
  6. 现在,在加载MasterView的ViewDidLoad方法后,应用程序会冻结。我在system.log中找不到任何东西。

    这是MasterViewController的代码

    - (void)viewWillAppear:(BOOL)animated {
        self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)];
        [self.tableView setContentOffset:CGPointMake(0,40)];
        self.tableView.tableHeaderView = self.searchBar;
    
        // Create and configure the search controller
        self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
        self.searchController.searchResultsDataSource = self;
        self.searchController.searchResultsDelegate = self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSString *months = @"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec";
        feeds = [months componentsSeparatedByString:@","];
        self.navigationItem.leftBarButtonItem = self.editButtonItem;
    
        UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
        self.navigationItem.rightBarButtonItem = addButton;
        self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        NSLog(@"numberOfRowsInSection");
    
        if(tableView == self.tableView)
        {
            return feeds.count;
        }
    
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like %@", self.searchBar.text];
        self.filteredFeeds = [feeds filteredArrayUsingPredicate:predicate];
        return feeds.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
        }
    
        cell.textLabel.text = [feeds objectAtIndex:indexPath.row];
    
    
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
            NSDate *object = _objects[indexPath.row];
            self.detailViewController.detailItem = object;
        }
    
        [self performSegueWithIdentifier: @"showDetail" sender: self];
    }
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([[segue identifier] isEqualToString:@"showDetail"]) {
            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
            NSDate *object = _objects[indexPath.row];
            [[segue destinationViewController] setDetailItem:object];
        }
    }
    

    我已将整个项目上传到以下位置。

    https://www.dropbox.com/s/yok9vngzv143npa/search.zip

    感谢任何形式的协助。

1 个答案:

答案 0 :(得分:0)

由于iOS的版本问题,我无法运行您的程序。 但是我看到了你的代码。我怀疑在代码上有一点,

- (void)viewWillAppear:(BOOL)animated {
    self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)];
    [self.tableView setContentOffset:CGPointMake(0,40)];
    self.tableView.tableHeaderView = self.searchBar;

    // Create and configure the search controller
    self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
    self.searchController.searchResultsDataSource = self;
    self.searchController.searchResultsDelegate = self;
}

当你从DetailViewController返回到MasterViewController时,你一次又一次地创建/分配UISearchBar和UISearchDisplayController,这些可能是你的应用程序冻结的原因。 接收器视图之前调用的“viewWillAppear”将被添加到视图层次结构中,并且在配置任何动画以显示视图之前。 视图控制器将其视图层次结构加载到内存后调用“viewDidLoad”。

我建议您在viewDidLoad方法中放置一次分配视图代码。

有关详情,请参阅此文档https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewDidLoad