iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值
#import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomic, assign) id <SendValue>delegate; // 创建一个正向传值的属性 @property (nonatomic,copy) NSString *currentTitle; @end
- (void)didButton{ NSArray *btntitles = [NSArray arrayWithObjects:@"按键一",@"按键二",@"按键三", nil]; for (int i=0; i<btntitles.count; i++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem]; //改变按键字体颜色 [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btn setTitle:[btntitles objectAtIndex:i] forState:UIControlStateNormal];
// 如果按钮的标题和属性中的 _currentTitle 相同,即和根页面中的导航条的 title 一样 if([_currentTitle isEqualToString:btn.currentTitle]){
//开启选中状态 btn.selected = YES; btn.tintColor = [UIColor whiteColor]; } [btn setTitleColor:[UIColor redColor] forState:UIControlStateSelected]; [btn addTarget:self action:@selector(titlebtnClicked:) forControlEvents:UIControlEventTouchUpInside]; btn.frame = CGRectMake(80, 140+60*i, self.view.frame.size.width-160, 40); btn.backgroundColor = [UIColor whiteColor]; [self.view addSubview:btn]; } } - (void)titlebtnClicked:(UIButton *)btn{ NSString *title = btn.currentTitle;
class="p1"> // 判断代理中是否有 sendBtnTitle :这个函数
if ([_delegate respondsToSelector:@selector(sendBtnTitle:)]){
// 代理 执行自己的 sendBtnTitle 函数,传参是 title
[_delegate sendBtnTitle:title];
}
NSLog(@"%@",title); [self.navigationController popViewControllerAnimated:YES]; }
#import <UIKit/UIKit.h> #define C(a,b,c,d) [UIColor colorWithRed:a/255.0 green:b/255.0 blue:c/255.0 alpha:d/255.0] #define IMG(name) [UIImage imageNamed:name] #import "FirstViewController.h" //将协议挂过来 @interface rootViewController : UIViewController<SendValue> @end
- (void)btnClicked{ FirstViewController *first = [[FirstViewController alloc] init]; //将当前页面的navigationItem.title传递进去 //正向传值 first.currentTitle = self.navigationItem.title; //将代理指定为当前rootViewController类的指针 first.delegate = self; [self.navigationController pushViewController:first animated:YES]; } //实现协议定义的方法 - (void)sendBtnTitle:(NSString *)title{ self.navigationItem.title = title; }
页面传值:
正向传值利用是属性传值;
反向传值利用代理传值;
属性传值:如果从A页面往B页面传值,在B页面中声明属性,在A页面中跳转事件中给B页面的属性赋值;
从后一个页面返回前一个页面不会执行前面页面的loadView和viewDidLoad方法,而是执行viewWillAppear方法,因为,loadView和viewDidLoad方法的作用是将视图加载到内存,而从后一个页面返回时,前一个页面已经加载到内存,所以不用再次加载,所以不执行loadView和ViewDidLoad方法;
代理传值:和代理设计模式一样,按照设置代理,遵循协议的那四步来就行,
/*
1,定义协议 (BaoMuProtocol)
2,遵循协议的类 (Nurse)
3.定义需要代理的类 (Mother)
4.建立关系 (Mother中定义一个代理类型的成员变量)
*/