UINavigationController导航视图控制器界面传值

  前面传后面的常用的是属性传值,后面传前面的有两种方法,第一种是协议传值,自己声明协议声明代理来完成,第二种是block传值,但是协议传值只能是有关联的传值,没有关联的传值是不行的,block就可以无关联的传值。

  下面我们来看下属性传值,我们需要先创建一个UIButton放到view里面。必须得有点击事件。  

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:
@"你被骗了" forState:UIControlStateNormal];
button.frame
= CGRectMake(100, 200, 100, 30); [button addTarget:self action:@selector(goTo:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];

  然后我们需要实现这个点击事件。

- (void)goTo:(UIButton *)slider {
    SecondViewController *second = [[SecondViewController alloc] init];
  // 给推送的那界面的赋值 second.
string = self.textField.text; second.color = [UIColor redColor]; [self.navigationController pushViewController:second animated:YES]; }

  既然后赋值,那第二张推送过来的界面肯定需要一个属性来接受这个传过来的值。

// 声明一个字符创属性来保存由第一个界面传过来的字符串内容
@property (nonatomic, copy) NSString *string;

  然后在 .m 中我们需要用一个 UILabel 来接收。才能在点击跳转时展示出来。

  _label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width, 30)];
    _label.text = self.string;
    _label.textAlignment = NSTextAlignmentCenter;
    _label.font = [UIFont boldSystemFontOfSize:30];
    _label.textColor = self.color;
    [self.view addSubview:_label];

  这样,属性传值就搞定了。接下来就是协议传值了。首先,我们需要声明一个协议。

// 1、声明协议
// UI中得协议名称为 当前类名 + Delegate
@protocol FourthViewControllerDelegate <NSObject>

- (void)pushValue:(NSString *)text;

@end

  然后就是第二步,声明代理。

// 2、声明代理
@property (nonatomic, assign) id<FourthViewControllerDelegate>delegate;

  在 .m 中,我们要添加一个UITextField用来输入传出的值,再添加一个UIButton,点击后跳转界面。

_textField = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, kWidth - 200, 30)];
    _textField.placeholder = @"请输入文本";
    _textField.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:_textField];
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
    [button setTitle:@"点我啊" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    button.frame = CGRectMake(150, 160, 100, 30);
    [self.view addSubview:button];

  实现UIButton的点击事件。

- (void)back {
    // 这个判断必须要,用来判断是否为空
    if (self.delegate != nil && [self.delegate respondsToSelector:@selector(pushValue:)]) {
        [self.delegate pushValue:self.textField.text];
        [self.delegate pushColor:[UIColor redColor]];
    }

    [self.navigationController popViewControllerAnimated:YES];
}

  然后只要在返回的那个界面接收<FourthViewControllerDelegate>协议。在第一个界面的button点击时间中添加代理,并实现代理方法就完成了代理传值。

- (void)goTo {
    FourthViewController *fourth = [[FourthViewController alloc] init];
    fourth.delegate = self; // 5、指定第二个界面的代理
    [self.navigationController pushViewController:fourth animated:YES];
    [fourth release];
}

// 6 实现代理方法
- (void)pushValue:(NSString *)text {
    self.label.text = text;
}

  最后我们来讲下block传值。在第二个界面的 .h 里面,定义一个Block。

typedef void (^TestBlock)(NSString *);

  接下来需要把Block声明属性。

// Block声明称属性,一定要使用copy
@property (nonatomic, copy) TestBlock testBlock;

  后面的方法跟前面协议传值一样,先添加UITextField跟UIButton,并实现UIButton的点击事件。

- (void)back {
    
    // 执行Block
    if (self.textBlock != nil) {
        self.textBlock(self.textField.text);
    }
    
    [self.navigationController popViewControllerAnimated:YES];
}

  然后我们回到第一个页面的 .m 里面实现这个Block方法。

- (void)back {
    SecondViewController *second = [[SecondViewController alloc] init];
    second.bada = ^(NSString *str) {
        self.label.text = str;
    };
}

  这样,这三种最常见的传值我们就完成了。

原文地址:https://www.cnblogs.com/shensq/p/5208211.html