控制器跳转之间的传值和navigationItem的修改

如果controllerA 需要 push 到 controllerB,  他们之间的传值有两种情况:

1. 如果使用了sb拖动segue线, 那么在controllerA 中手动实现

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法, 参数segue的destination便是controllerB, 在该方法中将需要传递给controllerB的信息传递给事先在controllerB的头文件中定义的属性即可. 在controllerB想要pop的时候, 如果想要传值给controllerA,那么此时有两种方法,  

控制器跳转之间的传值和navigationItem的修改_第1张图片

可以在控制器a中定义一个block, 在控制器b中的viewWillDisappear方法中插入以上代码即可实现传值,  另一种方法是手动修改navigationItem的返回按钮, 自定义返回按钮和按钮的action, 在自定义的action中插入以上代码也可以实现传值. 但是给NavigationBar自定义按钮的时候有一个坑,  如果在controllerB中写  

改代码是一点效果都没有的,  猜测因为可能是navigationcontroller的navigationItem是统一的, 某个单独的控制器想要修改navigationbar上面的item的话只能修改自己单独的类型, 所以正确的姿势应该是这样

这样就成功覆盖了系统本来的back按钮, 并且会调用我们自定义的方法.



2  如果控制器之间的跳转是靠我们纯代码创建的, 那么无论在控制器里面写多少次prepareForSegue方法都是没办法调用的, 这个时候两个控制器之间的传值就需要我们手动实现一些 代理  或者  block  或者  通知来实现传值机制.  注意 , 一般来说  由controllerA跳转到controllerB中几乎都不需要我们手动实现什么代理之类的东西,  一般在push到controllerB之前把A想要告诉B的值传递给他就好了 , 但是如果由B返回到A,  如果B想要告诉A一些东西, 或者想要A根据B界面操作得到的结果来修改A 界面上的一些数据的话  就需要使用此方法.  (其实  如果硬在controllerA的头文件中定义属性来接受b的数据的话   应该也是没问题的 )

你可能感兴趣的:(控制器跳转之间的传值和navigationItem的修改)