【问题标题】:NavigationController issue in non rootViewController view非 rootViewController 视图中的 NavigationController 问题
【发布时间】:2012-01-06 00:45:32
【问题描述】:

终于yesterday 我的 UISearchBar 工作正常了。突然间,我面临另一个问题。

当我浏览视图时,导航栏向右移动,并且再次出现相同的导航栏 -> 左侧的相同标题和导航按钮。 TableView 保持不动。 第二次点击导航按钮,是的,返回上一个视图。

我得到的注释是:在意外状态下完成导航转换。导航栏子视图树可能已损坏。

我浏览过这个论坛的相关问题,但对我没有帮助。

- (void)viewDidUnload
{
   [self setTableView:nil];
   [super viewDidUnload];
   [self setSearchController:nil];
   [self setSearchBar:nil];
}

- (void)tableView:(UITableView *)atableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Kings *kingsObj;

if(atableView==self.tableView)
{
    kingsObj=[self.kingsArr objectAtIndex:[indexPath row]];
    Items *items=[[Items alloc]initWithNibName:@"Items" bundle:nil];
    items.kingID=kingsObj.kingID;
    items.king=kingsObj.kingName;
    [self.navigationController pushViewController:items animated:YES];
    [items release];
}
else
{
    kingsObj=[self.filteredItems objectAtIndex:[indexPath row]];
}

Items *items=[[Items alloc]initWithNibName:@"Items" bundle:nil];
items.kingID=kingsObj.kingID;
items.king=kingsObj.kingName;
[self.navigationController pushViewController:items animated:YES];
[items release];
}

好的。 pushViewController 方法位于 didSelectRowAtIndexPath 中。现在有什么问题?在它表现良好之前。

【问题讨论】:

    标签: objective-c ios cocoa-touch


    【解决方案1】:

    错误是因为您两次推送新的 ViewController。您可以像这样简化didSelectRowAtIndexPath 代码:

    - (void)tableView:(UITableView *)atableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    {
        Kings *kingsObj; 
        if (atableView==self.tableView) {
            kingsObj = [self.kingsArr objectAtIndex:[indexPath row]];
        } else {
            kingsObj = [self.filteredItems objectAtIndex:[indexPath row]];
        }
    
        Items *items=[[Items alloc]initWithNibName:@"Items" bundle:nil];
        items.kingID=kingsObj.kingID;
        items.king=kingsObj.kingName;
        [self.navigationController pushViewController:items animated:YES];
        [items release];
    }
    

    【讨论】:

      【解决方案2】:

      你在编程 iOS5 吗?如果你是,那么你可能过度释放你的视图控制器“项目”。如果您打开了 ARC(自动引用计数),代码将在正确的时间为您释放对象。如果你也释放它,你可能会在堆栈上推送一个视图控制器,当导航控制器尝试使用它时它会消失。这会导致不稳定的情况。

      尝试删除您的 [items release] 声明,看看是否有帮助。

      罗伯

      【讨论】:

      • 不,它是 4.3。删除项目释放没有帮助。
      【解决方案3】:

      你做了两次。

      [self.navigationController pushViewController:items animated:YES];
      

      如果此行是YES,请拨打电话

      if(atableView==self.tableView)
      

      然后在该方法稍后再次调用它(在 else 语句之后(检查您的 {})
      这就是你最终得到你的:

      导航栏子视图树可能已损坏。

      【讨论】:

      • @Nathan 欢迎您按照 jonkroll 建议的方式重构您的代码,这样会更简洁,更不容易出错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多