我的导航栏和容器视图的工具栏子视图中有按钮,其enabled
属性取决于应用状态。目前按钮设置在viewWillAppear
中,因此如果我离开视图然后返回,则会发生正确的事情。我认为[containerView setNeedsDisplay]
可以做到这一点,但不是。
(我在容器视图中有UITextViews,我可以在更改textView.text
时强制更新,但app逻辑是这样的,当状态发生变化时,更难显式更新所有正确的按钮。)
答案 0 :(得分:0)
您可以在代码中的任何位置更改navigationBar和工具栏按钮的状态。对于视图的初始设置,将一些代码放在viewWillDisappear和viewWillAppear中是很有用的,就像你所做的那样。
例如,如果您想以编程方式将navigationBar上的按钮从“取消”更改为“输入”,当您向textField添加一些文本时,您可以初始化一个新的UIBarButtonItem并将其粘贴到旧的UIBarButtonItem所在的位置。假设您在viewWillAppear中添加了“取消”按钮,就像这样......
- (void)viewWillAppear:(BOOL)animated {
self.navigationItem.rightBarButtonItem =
[[[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(cancelAction)] autorelease];
}
然后在您的代码中的其他地方,您可以通过以完全相同的方式创建一个新导航项来简单地覆盖该导航项。但是,你显然想要给它一个不同的标题(在我的例子中输入'),也许是一个不同的动作。
就工具栏而言,UINavigationControllers可以轻松处理更改。这是因为每个UINavigationController + UIViewController组合都带有一个内置工具栏,只是除非你特别要求,否则它们不会显示它。
这样做的最佳方法是为UIViewController设置工具栏项,然后让navigationController根据需要显示/隐藏工具栏。
所以,例如,假设我在UIViewController的初始化方法中创建了三个UIBarButtonItem实例...那么我需要做的就是将它们粘贴在一个数组中并将该项目数组分配给工具栏,例如
[self setToolbarItems:[NSArray arrayWithObjects:button1, button2, button3, nil] animated:NO];
然后在viewWillAppear(或viewDidAppear)方法中我可以使用navigationController来显示工具栏:
[self.navigationController setToolbarHidden:NO animated:YES];
请记住在视图消失时执行相反操作(即使用setToolbarHidden进行相同的调用:YES)。 在UIViewController的代码中的任何一点,您都可以使用与初始化相同的方法更改按钮,即[self setToolbarItems:.....]。