0

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

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

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

  1. 启动应用程序
  2. 下拉搜索栏
  3. 输入文字
  4. 从搜索结果中选择一行
  5. 从详细视图中选择返回

现在应用程序在 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

任何形式的帮助表示赞赏。

4

1 回答 1

0

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

- (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

于 2013-09-29T03:24:37.607 回答