我正在使用视图控制器包含,作为我实现的一部分,子视图控制器需要禁用父视图控制器的导航控制器的条形按钮项。理论上,作为一个子视图控制器,我可以访问与父视图控制器相同的导航控制器(无论如何在我的上下文中)。
从调试中我可以看到self.navigationController
并self.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