Objective-C界面传值(二):协议传值

作者: Go_Spec | 来源:发表于2016-04-15 13:31 被阅读212次

协议传值

协议传值是利用协议的特性来实现界面传值的一种方法.
我们把要传值得页面当作协议声明者,把接收值得页面作为代理人
让代理人执行协议方法,从而将值传到接收页面

下面我们来看一下协议传值的具体步骤:

首先要明白签订协议的完整步骤:
1.声明协议
2.声明代理人属性
3.让代理人执行协议方法
4.签订协议
5.指定代理人
6.实现协议方法

下面来看一下代码实现:

AppDelegate.m的实现过程在这里不在重复给出,具体步骤可以到我的上一篇文章里阅读:(Objective-C界面传值(一):属性传值)

ViewController.m

#import "ViewController.h"
#import "SecondVIewController.h"
#pragma mark 4.签协议
@interface ViewController ()<PassValueProtocol>

@property(nonatomic, retain) UITextField *textField;

@end

@implementation ViewController

- (void)dealloc
{
    [_textField release];
    [super dealloc];
}

- (void)loadView
{
    [super loadView];

    self.textField             = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 175, 50)];
    self.textField.placeholder = @"请输入文本";
    self.textField.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:_textField];
    [_textField release];

    UIBarButtonItem *rightButton           = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(didClickedRightBarButton:)];
    self.navigationItem.rightBarButtonItem = rightButton;
    [rightButton release];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    self.navigationItem.title = @"首页";
    self.navigationController.navigationBar.barStyle    = UIBarStyleBlack;
    self.navigationController.navigationBar.translucent = NO;
}

#pragma mark 按钮点击方法
- (void)didClickedRightBarButton:(UIBarButtonItem *)button
{
    SecondVIewController *vc2 = [[SecondVIewController alloc] init];
#pragma mark 5.设置代理人
    vc2.delegate              = self;
    //从第一页向第二页传值依然采用属性传值
    vc2.secondString          = self.textField.text;
    [self.navigationController pushViewController:vc2 animated:YES];
    [vc2 release];
}

#pragma mark 6.实现协议方法
- (void)passString:(NSString *)string
{
    self.textField.text = string;
}

SecondViewController.h

#import <UIKit/UIKit.h>

#pragma mark 1.声明协议
@protocol PassValueProtocol <NSObject>

- (void)passString:(NSString *)string;

@end

@interface SecondVIewController : UIViewController
/**
 *  属性传值字符串
 */
@property(nonatomic, copy) NSString *secondString;
#pragma mark 2.声明代理人属性
@property(nonatomic, assign) id<PassValueProtocol> delegate;

@end

SecondViewController.m

#import "SecondVIewController.h"

@interface SecondVIewController ()

@property(nonatomic, retain) UITextField *textField;

@end

@implementation SecondVIewController

- (void)dealloc
{
    [super dealloc];
}

- (void)loadView
{
    [super loadView];

    self.textField             = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 175, 50)];
    self.textField.placeholder = @"请输入文本";
    self.textField.text        = self.secondString;
    self.textField.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:_textField];
    [_textField release];

    UIBarButtonItem *leftButton           = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(didClickedLeftBarButton:)];
    self.navigationItem.leftBarButtonItem = leftButton;
    [leftButton release];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    self.navigationItem.title = @"第二页";
}

#pragma mark 按钮点击方法
- (void)didClickedLeftBarButton:(UIBarButtonItem *)button
{
#pragma mark 3.代理人执行协议方法
    [self.delegate passString:self.textField.text];
    [self.navigationController popViewControllerAnimated:YES];
}

需要注意的几点:

  • 1.协议的6步一定不能缺少
  • 2.代码块中只是写了需要用到的几个方法的内容,系统自动生成的方法请不要随便删除
  • 3.控件设计坐标是根据iPhone6或iPhone6s尺寸写的,并没有做适配.

效果图:

首页框中输入字符串,点击"Add"
属性传值成功
在第二页文本框中输入字符串,点击"Cancel"
协议传值成功
总结,协议传值的用法步骤相对较多,需要勤加记忆.本文中实现的只是简单功能.如果有错误可以联系我,我会及时核对并改正!

相关文章

  • iOS_UI_08_界面通信

    第八章 界面通信 一、属性传值 二、协议传值 三、Block传值

  • UI总结-界面传值

    UI总结-界面传值(属性传值,协议传值,block传值,通知中指传值) 在编程过程中,界面传值是很重要的一部分,常...

  • Objective-C界面传值(二):协议传值

    协议传值 协议传值是利用协议的特性来实现界面传值的一种方法.我们把要传值得页面当作协议声明者,把接收值得页面作为代...

  • Swift 代理传值方式

    协议传值 协议传值,主要用于代理模式。假设我们要实现从详情界面传值到主界面这一需求,首先,我们需要拟定一份协议,为...

  • 界面之间的通信知识点总结

    界面通信的三种方法: 属性传值:将第一页页面的值传给第二个页面。 代理传值:实现界面传值要6步: 声明协议和协议的...

  • swift中的协议代理传值

    协议代理传值一般使用在下级界面往上级界面传值的情况,这里将上级界面设定为A界面,下级界面设定为B界面。传值的具体操...

  • iOS的5种传值

    (-)属性传值 属性传值(场景)一般用于正向传值,即第一个界面传值给第二个界面 属性传值是这几大传值中最简单的传值...

  • iOS开发-属性、block、代理、通知传值

    传值在开发中我们会经常用到,传值又分为正向传值和反向传值。从界面一跳转到界面二且将值从界面一传递给界面二使用,称之...

  • iOS 属性、代理、通知、Block传值

    实际开发中,几乎到处都会有用到传值,而传值分为正向传值以及逆(反)向传值,比如从界面一调到界面二,并将值从界面一传...

  • iOS中界面传值的几种方式

    1.属性传值 属性传值适用于顺序传值,从前面的界面传值给后面的界面。 2.代理传值 用代理的方式实现界面间传值稍微...

网友评论

本文标题:Objective-C界面传值(二):协议传值

本文链接:https://www.haomeiwen.com/subject/zkjglttx.html