刘东源 發表於 2020-4-15 11:42:00

IOS开发中的页面传值

<h1 id="ios开发中的页面传值">IOS开发中的页面传值</h1>
<h2 id="导言">导言</h2>
<p>本文将基础的介绍一些关于IOS中页面传值的一些方法,语言基于<strong>Objective-c</strong></p>
<ol>
<li>属性传值</li>
<li>代理传值</li>
<li>Block传值</li>
<li>单利传值</li>
</ol>
<h2 id="1属性传值">1.属性传值</h2>
<p>A页面的值跳转到B页面之后把值传给B页面,只需要在.h文件定义属性,A页面再跳转之前赋值给B页面的实例对象属性即可。这种传值方式一般用于正向传值给跳转界面。</p>
<p><strong>A页面 .m文件</strong></p>
<pre><code class="language-objective-c">#import "ViewController.h"
#import "ViewController2.h"

@interface ViewController ()
{
        //此处要定义成全局的控件,因为B页面也要用
    UITextField *tf;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    ;
    self.view.backgroundColor = ;
    // Do any additional setup after loading the view.
    tf = [ initWithFrame:CGRectMake(70, 200, 280, 40)];
    tf.backgroundColor = ;
    ;
   
    UIButton *btn = ;
    btn.frame = CGRectMake(160, 260, 100, 30);
    ;
    ;
    ;
   
}

- (void) jump{
    ViewController2 *v2 = [ init];
   
    //在跳转前进行传值
    v2.str = tf.text;
   
    ;
}
@end
</code></pre>
<p><strong>B页面 .h文件</strong></p>
<pre><code class="language-objective-c">#import &lt;UIKit/UIKit.h&gt;

NS_ASSUME_NONNULL_BEGIN

@interface ViewController2 : UIViewController
//声明一个属性用来接收要传过来的值,这里定义为传过来一个字符串
@property(nonatomic,strong) NSString *str;
@end

NS_ASSUME_NONNULL_END
</code></pre>
<p><strong>B页面 .m文件</strong></p>
<pre><code class="language-objective-c">#import "ViewController2.h"

@interface ViewController2 ()


@end

@implementation ViewController2

- (void)viewDidLoad {
    ;
    self.view.backgroundColor = ;
   
    UILabel *lab = [ initWithFrame:CGRectMake(70, 200, 280, 40)];
    lab.backgroundColor = ;

    //lab的值就是传过来的字符串的值
    lab.text = self.str;
   
    ;
    UIButton *btn2 = ;
    btn2.frame = CGRectMake(160, 260, 100, 30);
    ;
    ;
    ;
}

- (void) back {
    ;
}
@end
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2005461/202004/2005461-20200415113822167-306004308.jpg" alt="" loading="lazy"></p>
<h2 id="2代理传值">2.代理传值</h2>
<p>属性传值用于正向传值,当我们需要反向传值时,使用代理传值</p>
<p>我们将要传回去的值当做代理方法中的参数传回去。</p>
<p>我们是在第二个页面中写协议,在第一个页面中来用</p>
<p>下面是写协议的操作(以下都是在B页面的 .h 文件完成)</p>
<ul>
<li>
<p>1.声明协议</p>
</li>
<li>
<p>2.声明属性(代理人)</p>
</li>
<li>
<p>3.声明代理方法</p>
</li>
</ul>
<p><strong>B页面的 .h文件</strong></p>
<pre><code class="language-objective-c">#import &lt;UIKit/UIKit.h&gt;

NS_ASSUME_NONNULL_BEGIN

//1.声明协议
@protocol passValueDelegate &lt;NSObject&gt;
//3.实现方法
- (void)passColor:(id) color;
@end

@interface ViewController2 : UIViewController

//2.声明属性(代理人)
//默认用assign 和 id
@property(nonatomic,assign) id &lt;passValueDelegate&gt; delegate;

@end

NS_ASSUME_NONNULL_END
</code></pre>
<p>接下来是实现协议的操作(以下操作均是在A页面的 .m文件完成)</p>
<ul>
<li>遵守协议</li>
<li>指定代理人</li>
<li>写代理方法</li>
</ul>
<p><strong>A页面的 .m文件</strong></p>
<pre><code class="language-objective-c">#import "ViewController.h"
#import "ViewController2.h"

//遵守协议
@interface ViewController () &lt;passValueDelegate&gt;

@end

@implementation ViewController

- (void)viewDidLoad {
    ;
    self.view.backgroundColor = ;
   
    UIButton *btn = ;
    btn.frame = CGRectMake(160, 260, 100, 30);
    ;
    ;
    ;
   
}

- (void) jump{
    ViewController2 *v2 = [ init];
   
    //指定代理人
    v2.delegate = self;
    ;
}

//写代理方法
- (void) passColor:(id)color {
    self.view.backgroundColor = color;
}

@end
</code></pre>
<p>在B页面返回A页面的时候触发代理方法</p>
<p><strong>B页面的 .m文件</strong></p>
<pre><code class="language-objective-c">#import "ViewController2.h"

@interface ViewController2 ()
@end

@implementation ViewController2

- (void)viewDidLoad {
    ;
    // Do any additional setup after loading the view.
    self.view.backgroundColor = ;

    UIButton *btn2 = ;
    btn2.frame = CGRectMake(160, 260, 100, 30);
    ;
    ;
    ;
}

- (void) back {
    //返回的时候触发代理方法
    ;
    ;
}

</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2005461/202004/2005461-20200415113846198-1674324009.jpg" alt="" loading="lazy"></p>
<h2 id="3block传值">3.Block传值</h2>
<p>Block回调传值通常用于两个页面之间的反向传值。A页面需要接收来自B页面的值,即反向传值,在这里我们用Block回调实现。</p>
<p>以下是使用block的基本操作</p>
<ul>
<li>声明</li>
</ul>
<p>在B页面中声明block属性</p>
<pre><code class="language-objective-c">#import &lt;UIKit/UIKit.h&gt;
NS_ASSUME_NONNULL_BEGIN
@interface SecondViewController : UIViewController
//用copy将block从栈区拷贝到堆区里面去
@property(nonatomic,copy) void(^myBlock)(NSString *str);
@end
NS_ASSUME_NONNULL_END
</code></pre>
<ul>
<li>定义</li>
</ul>
<p>在A页面中,获取B页面对象,并通过此对象来编写block的实现</p>
<pre><code class="language-objective-c">#import "RootViewController.h"
#import "SecondViewController.h"
@interface RootViewController ()
{
    UILabel *lab;
}

@end

@implementation RootViewController

- (void)viewDidLoad {
    ;
    self.view.backgroundColor = ;
    self.view.backgroundColor = ;
    self.navigationItem.rightBarButtonItem = [ initWithTitle:@"跳转" style:UIBarButtonItemStylePlain target:self action:@selector(Next)];
   
    lab = [ initWithFrame:CGRectMake(70, 200, 280, 40)];
    lab.backgroundColor = ;
    lab.textAlignment = NSTextAlignmentCenter;
    ;
}

- (void)Next {
    SecondViewController *v2 = [ init];
    //block的实现
    v2.myBlock = ^(NSString * _Nonnull str) {
      self-&gt;lab.text = str;
    };
    ;
}

@end
</code></pre>
<p>注意:此处只是定义该Block方法,当用户点击了”跳转按钮“时,Block内部的代码并不会执行,只有该Block被调用时,才会执行该Block内部的代码。</p>
<p>本例中,当在第二个页面点击”返回“时,才会调用block内的代码</p>
<ul>
<li>调用</li>
</ul>
<p>在B页面中调用Block进行传值</p>
<pre><code class="language-objective-c">#import "SecondViewController.h"

@interface SecondViewController ()

@end
@implementation SecondViewController

- (void)viewDidLoad {
    ;
    self.view.backgroundColor = ;
    self.navigationItem.leftBarButtonItem = [ initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(Back)];
}
- (void) Back{
    //调用
    self.myBlock(@"block传值");
    ;
}

@end
</code></pre>
<p><img src="https://img2020.cnblogs.com/blog/2005461/202004/2005461-20200415113830990-1000860335.jpg" alt="" loading="lazy"></p>
<p>有关block的一些基本相关知识可以查看我的另一篇博客。</p>
<h2 id="4通知中心传值">4.通知中心传值</h2>
<p>通知中心传值,可以跨越多个页面传值, 一般也是从后面的页面传给前面的页面。(一对多的过程)</p>
<p>举个例子,广播电台开始播放一档节目时,这个电台的频率就是传递的值,当我们用户想要听这个节目时,我们就要打开收音机,然后自己调频到相应的频道来听这个节目。这个过程中,广播站只负责发送,谁来接收他不管。</p>
<p>接收消息的页面就是<strong>收音机</strong>,注册通知中心就是<strong>打开收音机并且调频</strong></p>
<p>发送消息的页面就是<strong>广播站</strong>,在页面跳转时<strong>发送广播</strong></p>
<p>以下是通知中心传值的基本操作</p>
<ul>
<li>在A页面建立一个通知中心,通过通知中心,注册一个监听事件</li>
<li>在A页面中,设置接收到通知的事件</li>
<li>在A页面移除通知中心</li>
<li>在B页面中,建立一个通知中心,通过通知中心,发送通知(就是传值的过程),将要传输的值作为object传值给第一个界面</li>
</ul>
<pre><code class="language-objective-c">//监听通知
// 通知中心是一个单例,它会将通知广播出去,内存中的所有对象都可以通过该通知中心来监听其他对象或者是自己所发出的通知
    // 第一个参数:观察者(即谁收到这个通知将会做出响应)
    // 第二个参数:观察者收到通知以后将会调用哪个方法
    // 第三个参数:通知的名称
    // 第四个参数:监听谁发来的通知,nil表示所有对象发送的通知都接收
    [ addObserver:self selector:@selector(countAdded) name:@"countAdded" object:nil];

// 发送通知
    // 第一个参数:通知名称
    // 第二个参数:通知的发送者
    // 第三个参数:一个字典,随着通知一起传递的信息
    [ postNotificationName:@"countAdded" object:self userInfo:userInfo];
</code></pre>
<p>**在A页面 .m文件注册通知中心,并执行通知的方法,最后移除通知中心</p>
<pre><code class="language-objective-c">#import "RootViewController.h"
#import "SecondViewController.h"
@interface RootViewController ()
{
    UILabel *lab;
}

@end

@implementation RootViewController

- (void)viewDidLoad {
    ;
    self.view.backgroundColor = ;
    self.view.backgroundColor = ;
    self.navigationItem.rightBarButtonItem = [ initWithTitle:@"跳转" style:UIBarButtonItemStylePlain target:self action:@selector(Next)];
   
    lab = [ initWithFrame:CGRectMake(70, 200, 280, 40)];
    lab.backgroundColor = ;
    lab.textAlignment = NSTextAlignmentCenter;
    ;
   
    //注册通知
    [ addObserver:self selector:@selector(receiveMessage:) name:@"90.8" object:nil];
}


//收到通知执行的方法
- (void)receiveMessage:(NSNotification *)mes{
    //从通知里面取出值
        //传的值需要转换成字符串
    lab.text = ;
}

- (void)Next {
    SecondViewController *v2 = [ init];
    ;
}

//移除当前对象监听的事件
- (void)dealloc
{
        //这是删除所有的通知中心,也可以按照属性来删除
    [ removeObserver:self];
}

@end
</code></pre>
<p><strong>在B页面 .m文件发送通知</strong></p>
<pre><code class="language-objective-c">#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
    ;
    self.view.backgroundColor = ;
    self.navigationItem.leftBarButtonItem = [ initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(Back)];
}
- (void) Back{
   
    //发送通知
    [ postNotificationName:@"90.8" object:@"通知传值" userInfo:nil];
    ;
}

@end
</code></pre>
<p>消息通知中心传值使用时会使得代码非常乱,但是他可以跨多个页面传值。</p>
<p>以上就是一些关于页面传值的基本操作</p><br><br>
来源:https://www.cnblogs.com/mgd666/p/12704201.html
頁: [1]
查看完整版本: IOS开发中的页面传值