第⼋八讲 :UINavigationController、界⾯面通信

来源:互联网 发布:硬盘数据恢复软件排名 编辑:程序博客网 时间:2024/06/05 22:43

1.属性传值:
一般用于上级页面传值到下级页面,属性声明在下级页面,用于接收上级传过来的值.
2.代理传值:
实质:通过协议方法中的<参数>实现值传递:如- (void)sendValue:(NSString *)text
口诀:①.哪个页面(类)需要值,这个页面(类)即代理,协议方法的实现和遵守协议以及设置代理就写在哪个页面(类)里.
②.声明代理属性,就写在传值的那个页面(类)里,这个页面(类)即委托人.
③.想什么时候将值传过去,那就是让[代理 执行协议方法:实参值];
//注意:如果想用好代理-协议:
①.要明确谁是委托人:registerVC
②.谁是代理:loginVC
③.委托人要让代理做什么事:RegisterViewControllerDelegate
其实:
registerVC只是负责将值传到上级页面(代理),代理接收到值,至于接收到的值,代理loginVC怎么处理,registerVC不管.






loginViewController.m




#import "LoginViewController.h"#import "RegisterViewController.h"@interface LoginViewController ()@property (nonatomic,retain)UILabel * label;@property (nonatomic,retain)UITextField * textField;@end@implementation LoginViewController- (void)dealloc{    [_label release];    [_textField release];        [super dealloc];}- (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor = [UIColor cyanColor];#pragma mark----创建UILabel,UITextField ,UIBarButtonItem;    //用来显示下级传过来的字符串(值)        self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, 300, 150, 30)];        _label.backgroundColor = [UIColor whiteColor];        [self.view addSubview:_label];    [_label release];        //用来将用户输入的值传至下一级页面        self.textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 400, 150, 30)];        _textField.borderStyle = UITextBorderStyleRoundedRect;        [self.view addSubview:_textField];        [_textField release];            //点击BarButtonItem推出下一级页面        UIBarButtonItem * BI = [[UIBarButtonItem alloc] initWithTitle:@"PUSH" style:UIBarButtonItemStylePlain target:self action:@selector(clickBI:)];        self.navigationItem.rightBarButtonItem = BI;    [BI release];                }//当点击BarButtonItem时,会触发这个方法,推出下一级页面。- (void)clickBI:(UIBarButtonItem *)BI{    RegisterViewController * registerVC = [[RegisterViewController alloc] init];        //第五步 、设置代理        registerVC.delegate = self;    //属性传值    registerVC.text = _textField.text;        [self.navigationController pushViewController:registerVC animated:YES];    [registerVC release];                    }//第三步、实现协议中的方法- (void)sendValue:(NSString *)text{        _label.text = text;                }- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}/*#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {    // Get the new view controller using [segue destinationViewController].    // Pass the selected object to the new view controller.}*/@end
appdelegate.m
#import "AppDelegate.h"#import "RegisterViewController.h"#import "LoginViewController.h"@interface AppDelegate ()@end@implementation AppDelegate-(void)dealloc{        [_window release];        [super dealloc];        }- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];        _window.backgroundColor = [UIColor whiteColor];        LoginViewController * loginVC = [[LoginViewController alloc] init];        RegisterViewController * registerVC = [[RegisterViewController alloc] init];                UINavigationController * NC = [[UINavigationController alloc] initWithRootViewController:loginVC];        _window.rootViewController = NC;              [loginVC release];    [NC release];    [_window makeKeyAndVisible];        [_window release];                        return YES;}

#import <UIKit/UIKit.h>#import "RegisterVCDelegate.h"@interface LoginViewController : UIViewController<RegisterVCDelegate>//第二步遵守协议@end

#import <UIKit/UIKit.h>#import "RegisterVCDelegate.h"@interface RegisterViewController : UIViewController//接收上级页面传过来的值。@property (nonatomic,retain)NSString * text;//声明一个代理属性@property (nonatomic,assign)id<RegisterVCDelegate>delegate;@end

#import "RegisterViewController.h"@interface RegisterViewController ()@property (nonatomic,retain)UILabel * label;@property (nonatomic,retain)UITextField * textField;@end@implementation RegisterViewController- (void)dealloc{    [_label release];    [_textField release];        [super dealloc];}- (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor = [UIColor yellowColor];            self.label = [[UILabel alloc] initWithFrame:CGRectMake(100, 300, 150, 30)];        _label.backgroundColor = [UIColor whiteColor];        [self.view addSubview:_label];    [_label release];        //用来将用户输入的值传至下一级页面        self.textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 400, 150, 30)];        _textField.borderStyle = UITextBorderStyleRoundedRect;        [self.view addSubview:_textField];        [_textField release];            //点击BarButtonItem推出下一级页面        UIBarButtonItem * BI = [[UIBarButtonItem alloc] initWithTitle:@"POP" style:UIBarButtonItemStylePlain target:self action:@selector(clickBI:)];        self.navigationItem.leftBarButtonItem = BI;    [BI release];            #pragma mak------将上级页面传进来的值显示在label上        _label.text = _text;                                }- (void)clickBI:(UIBarButtonItem *)BI;{            [self.navigationController popToRootViewControllerAnimated:YES];            //检查sendValue方法有没有实现,如果没有实现,就不执行这个方法,如果实现就执行。    if ([_delegate respondsToSelector:@selector(sendValue:)]) {        [_delegate sendValue:_textField.text];    }                }- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    }



0 0
原创粉丝点击