1. 程式人生 > >KVO---視圖間數據的傳遞:標簽顯示輸入的內容【多個視圖中】

KVO---視圖間數據的傳遞:標簽顯示輸入的內容【多個視圖中】

tla trac content color smis rep ret oot ani

RootViewController.m

#import "ModalViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController {

    ModalViewController *modalCtrl;
    
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor redColor];
    
    UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 200, 20)];
    textLabel.tag = 100;
    textLabel.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:textLabel];
    
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(50, 150, 100, 30);
    [button setTitle:@"打開" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
    
    modalCtrl = [[ModalViewController alloc] init];
    
    //監聽modal控制器的text屬性
    [modalCtrl addObserver:self forKeyPath:@"text"
                   options:NSKeyValueObservingOptionNew
                   context:NULL];
    
}

//KVO觸發方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if ([keyPath isEqualToString:@"text"]) {
        
        NSString *text = [change objectForKey:@"new"];
        UILabel *label = (UILabel *)[self.view viewWithTag:100];
        label.text = text;
        
    }
    
}

- (void)buttonAction
{
    [self presentViewController:modalCtrl animated:YES completion:NULL];
    
}
ModalViewController.m
@interface ModalViewController ()
{
    NSString *_text;
}
@end

@implementation ModalViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor greenColor];
    
    UITextField *textFiled = [[UITextField alloc] initWithFrame:CGRectMake(50, 60, 160, 30)];
    textFiled.tag = 100;
    textFiled.delegate = self;
    textFiled.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:textFiled];
    //顯示鍵盤
    [textFiled becomeFirstResponder];
    
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(50, 150, 100, 30);
    [button setTitle:@"返回" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
}

//按鈕點擊事件
- (void)buttonAction
{
    [self dismissViewControllerAnimated:YES completion:NULL];
    
//    UITextField *field = (UITextField *)[self.view viewWithTag:100];
//    NSString *text = field.text;
    
//    self.text = text;
    
}

#pragma UITextField delegate

//點擊return調用的協議方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField {

    //收起鍵盤
    [textField resignFirstResponder];
    
    return YES;
    
}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSLog(@"string:%@",string);
//    string 是正在輸入的最後一個字符
    
    NSLog(@"%@",textField.text);
//    textField.text 是輸入的內容的前段字符(最後一個字符不包含)

//    UITextField *field = (UITextField *)[self.view viewWithTag:100];
//    NSString *text = field.text;
    NSString *str = [NSString stringWithFormat:@"%@%@",textField.text,string];
    NSLog(@"str:%@",str);
    self.text = str;
    
    return YES;
    
}


KVO---視圖間數據的傳遞:標簽顯示輸入的內容【多個視圖中】