iOS开发之技能点那些开发的事程序员

iOS页面传值问题(Objective-C篇)

2016-01-09  本文已影响3503人  4ba6804ff45f

因为自己对这方面还有一些不够熟练。现在总结一下常用的几种方法,方便自己复习和以后使用。

在iOS界面搭建中,页面传值是肯定会使用到的。而经常使用的传值方式也无非那么几种。

一、委托方法

协议方法是一种非常常用的传值方法,只要在协议中声明一个协议方法,然后两个类一个作为委托方一个作为遵守方来调用和实现方法就可以实现传值。十分高效而且针对性很强。

@protocol PassValueDelegate <NSObject>

@optional

- (void)passValue:(NSString *)value;

@end

1、声明delegate属性

@property (nonatomic, weak) id<PassValueDelegate> delegate;

2、调用passValue:方法,这里是在跳转的按钮方法中调用的:

- (IBAction)buttonAction:(id)sender { 
    [self.delegate passValue:self.valueTextField.text];
    [self dismissViewControllerAnimated:YES completion:nil];
    
}

1、 遵守协议:

@interface KLViewController () <PassValueDelegate>

@end

2、设置代理,这里是在跳转的button方法中写的:

KLAViewController *aViewC = [[KLAViewController alloc] init];
aViewC.delegate = self;

3、重写协议方法,这里的value参数便是从另一个类中调用该方法时传出的的值,在这里我们把它赋给UILabel:

- (void)passValue:(NSString *)value
{
    self.valueLabel.text = value;
}

二、block方法

block大家应该都不陌生了,从iOS4.0开始广泛的应用在iOS开发中,是一种C语言的扩充功能,在Objective-C中也得到了很好地支持与运用,在这里我们不对其本身多做赘述。只是运用block来实现界面之间传值功能。

typedef void(^returnTextBlock)(NSString *text);
@property (nonatomic, copy) returnTextBlock returnTextBlock;
- (void)returnText:(returnTextBlock)textBlock;
- (void)returnText:(returnTextBlock)textBlock
{
    self.returnTextBlock = textBlock;
}
- (IBAction)buttonAction:(id)sender {
    self.returnTextBlock(self.myTextField.text);
    [self dismissViewControllerAnimated:YES completion:nil];
}  
- (IBAction)buttonActive:(id)sender {
    KLAViewController *aViewC = [[KLAViewController alloc] init];
    // 拿到block传的值
    [aViewC returnText:^(NSString *text) {
        self.textLabel.text = text;
    }];
    [self presentViewController:aViewC animated:YES completion:nil
     ];  
}

三、使用NSNotificationCenter通知模式

类似于广播的一种传值模式,十分简单易用。一般负责在两个不同的类之间传值,且耦合度很低。着这种方式中NSNotificationCenter担任一个中介者的身份,已提供观察者与被观察者相互传递信息。

Objective-C中使用NSNotifation表示通知,每个NSNotifation对象都具有名称(NSNotificationCenter根据该名称检索此通知的所有观察者)、来源对象(发布该通知的对象)和可选的userInfo字典(来源对象需要告诉观察者的额外信息)。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(printName:) name:@"name" object:nil];
NSString *name = @"Leon-Kang";
[[NSNotificationCenter defaultCenter] postNotificationName:@"name" object:name];
- (void)printName:(NSNotification *)notifaction {
    NSString *name = notifaction.object;
    NSLog(@"%@", name);
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

需要代码戳这里

上一篇 下一篇

猜你喜欢

热点阅读