对UIBackBarButtonItem的理解

来源:互联网 发布:工程造价在国企知乎 编辑:程序博客网 时间:2024/04/28 07:51

UIBackBarButtonItem(返回按钮)是由全局UINavigationController控制生成的(设置在当前视图控制器的UINavigationItem中),生成的时机为当前视图控制器已压入UINavigationController栈中、尚未初始化时。(参考自:http://stackoverflow.com/questions/6933280/why-is-self-navigationitem-backbarbuttonitem-always-nil:

Make sure you only try to read backBarButtonItem etc after viewDidAppear.. in viewWillAppear/viewDidLoad/init.. the navigation controller won't 
have set up the back button yet, because the view hasn't fully been pushed onto the navigation stack. – darvids0n Aug 4 '11 at 3:40)


当UIBackBarButtonItem尚未在上一个视图控制器中定义,则当前的返回按钮为空对象,此时UINavigationController设置当前返回按钮的标题(UIBackBarButtonItem.title)=上一个ViewController的标题值。假如上一个ViewController的标题值不存在,则当前UIBackBarButtonItem的标题值为“Back”


-----------------------------------------------------------------------------------

从上一个控制器A出栈到当前控制器B压栈过程中发生的事情,按顺序可列为(注意忽略了一些与主题不相关的细节):


    ①当前控制器A调用[self.navigationController pushViewController:nextViewController animated:YES];
    ②当前控制器A出栈;
    ③控制器B入栈;
->④全局的UINavigationController对控制器B的返回按钮进行设置;(控制器包含的视图View尚未显示)

    ⑤显示控制器B对应的视图View;


注意上面所说“全局的UINavigationController对控制器B的返回按钮进行设置”,不是设置控制器B的navigationItem.backBarButtonItem属性,而是设置当前控制器本身的返回按钮
默认情况下,在当前视图控制器调用self.navigationItem.backBarButtonItem=nil ,除非你手动实例化它。(请记住它代表的是下一个视图的返回按钮,而不是当前的)

系统不允许开发者获取当前视图控制器所显示的返回按钮UIBackBarButtonItem

-----------------------------------------------------------------------------------

无论当前视图控制器ViewController是否为根ViewController,每个ViewController的self.navigationItem.backBarButtonItem默认为nil(除非我们亲自去给它赋值),所以不可能在当前的ViewController中通过如下代码来设置下一个页面的返回按钮主题:

[self.navigationItem.backBarButtonItem setTitle:@"..."]

只能先新建一个UIBarButtonItem,并让backBarButtonItem指向它:

UIBarButtonItem* back=[[UIBarButtonItem alloc]initWithTitle:@"AAA" style:UIBarButtonItemStyleBordered target:nil action:nil];self.navigationItem.backBarButtonItem=back;

推荐一篇文章(内容正确性本人未检验):如何设置backBarButtonItem的title和action


0 0
原创粉丝点击