0

我正在使用视图控制器包含,作为我实现的一部分,子视图控制器需要禁用父视图控制器的导航控制器的条形按钮项。理论上,作为一个子视图控制器,我可以访问与父视图控制器相同的导航控制器(无论如何在我的上下文中)。

从调试中我可以看到self.navigationControllerself.parentViewController.navigationController设置为相同的地址。

例如:

NSLog(@"%@ - %@", self.navigationController, 
                  self.parentViewController.navigationController);

NSLog(@"%@ - %@", self.navigationItem, 
                  self.parentViewController.navigationItem);

NSLog(@"%@ - %@", self.navigationController.navigationItem, 
                  self.parentViewController.navigationController.navigationItem);

导致以下控制台日志:

<UINavigationController: 0xc482290> - <UINavigationController: 0xc482290>

<UINavigationItem: 0xa5f3620> - <UINavigationItem: 0xc482490>

<UINavigationItem: 0xa5f36e0> - <UINavigationItem: 0xa5f36e0>

结果

  • 正如预期的那样,导航控制器是相同的(self-> navController == self-> parent->navController)。
  • 导航项不同,这是意料之中的。每个视图控制器都有自己的导航项(self-> navItem != self-> parent->navItem)。
  • 正如预期的那样,从父视图控制器或子视图控制器访问导航控制器导航项是相同的(self-> navController->navItem == self-> parent->navController->navItem

所以我现在问:为什么不使用以下代码禁用子视图控制器中的条形按钮项:

self.navigationController.navigationItem.rightBarButtonItem.enabled = NO;

鉴于它们的共享地址,这应该是以下(按预期工作)的同义词:

self.parentViewController.navigationController.navigationItem.rightBarButtonItem.enabled = NO;

更新

我阅读日志的速度太快了。实际上 parentViewController 和导航控制器有 2 个不同的导航项。我在这里的示例中错过了这一点,因为内存地址非常接近:0xa5f3620!= 0xa5f36e0

4

2 回答 2

1

好吧,基本上问题是导航控制器更新栏按钮项的方式,基本上,只要顶级子项发生更改,按钮就会更新。对于右栏按钮项,如果新的顶级子项具有自己的栏按钮项,则导航控制器将选择现有的项,如果不是则不显示任何内容。因此,在您的情况下,parrentViewController 已经有一个未禁用的 navigationItem.rightBarButonItem,通过调用self.navigationController.navigationItem.rightBarButtonItem.enabled = NO;您正在禁用孩子的 nabigationItem.rightBarButtonItem 并且您看不到这一点,因为只有在更改顶级孩子时才会进行更新,即不是你的情况。

因此,为了禁用 parentViewController 右键,您应该执行以下操作: self.parentViewController.navigationItem.rightBarButtonItem.enabled = NO

有关导航栏按钮更新的更多详细信息,请查看有关更新导航栏项目的苹果文档

于 2013-05-17T16:09:06.337 回答
1

UINavigationController 有它自己的导航项(就像任何其他 UIViewController 一样),只有在将它推送到另一个 UINavigationController 的堆栈时才会发挥作用。

通常,您不会将一个 UINavigationController 推到另一个上,因此操纵 self.navigationController.navigationItem 毫无意义。

编辑:

检查......我刚刚添加了:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    UINavigationItem *myNavControllersItem = self.navigationController.navigationItem;
    UINavigationItem *myItem = self.navigationItem;
    NSLog(@"%@ - %@", myNavControllersItem, myItem);
}

到我推送到 NavController 的 VC 并获得:

<UINavigationItem: 0x1ed0c170> - <UINavigationItem: 0x1ed46330>

此外,如果我添加:

self.navigationItem.rightBarButtonItem.enabled = NO;viewDidAppear右侧的按钮被禁用。

如果我添加:

self.navigationController.navigationItem.rightBarButtonItem.enabled = NO;它不是。

于 2013-05-17T16:38:21.677 回答