详解iOS页面传值(顺传 逆传)

2025-05-29 0 49

代理协议传值

顺传

假设A为第一个视图控制器,B为第二个视图控制器

在A中导入B的.h文件

场景:A向B传值

第一步:在B的.h中定义一个content属性

?

1

2

3
@interface SecondViewController : UIViewController

@property(nonatomic,copy)NSString *contents;

@end

第二步:在点击A中的按钮方法里面给B的content属性赋值

?

1

2

3

4

5

6

7
- (void)buttonAction:(UIButton *)button

{

NSLog(@"进入第二页");

SecondViewController *secondVC = [SecondViewController alloc] init];

secondVC.contents = self.label.text;

[self.navigationController pushViewController:secondVC animated:YES];

}

第三部:在B使用content的属性给相应的控件赋值

?

1

2

3

4

5

6
@implemention SecondViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];

self.navigationItem.title = self.contents;

}

逆传

代理传值使用在两个界面传值的之后,从后向前传值

假设A为第一个视图控制器,B为第二个视图控制器

场景:B向A传值

第一步:首先在B的.h文件中声明协议和协议方法

第二步在B的.h中声明一个代理属性,这里主要注意用assign或weak修饰,weak和assign是一种非拥有关系的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用的对象的引用计数。但是在一个对象被释放后,weak会自动将指针指向nil,而assign则不会。所以,用weak更安全些。

@property (nonatomic,weak)id<协议名>delegate;

?

1

2

3

4

5

6

7

8

9

10
#pragma mark 这里是B的.h

#import<UIKit/UIKit.h>

@protocol CsutomTabBarDelegate<NSObject>

// 把btn的tag传出去的方法

- (void)selectedIndexWithTag:(NSInteger)tag;

@end

@interface CustomTabBarView : UIView

//声明一个代理属性delegate

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

@end

第三部:在B即将POP回前一个界面的时候,在pop方法的上一行使用协议方法传递数据[self.delegate 协议方法名:(参数,也就是要传回的数据)

?

1

2

3

4

5

6

7

8

9

10

11

12
#pragma mark 这里是B的.m

// 判断在制定的代理类中是否实现了该协议方法

// 确保执行时无此方法时不崩溃

if([self.delegate respondsToSelector:@selector(selectedIndexWithTag:)])

{

// 执行代理方法

[self.delegate selectedIndexWithTag:(sender.tag - 1000)];

}

else

{

NSLog(@"协议中的方法没有实现");

}

在A的.m中,在push到B界面方法之前,B对象的初始化之后,指定A对象为B对象的代理(B对象).delegate = self此时会有黄色警告,因为没有准守协议

?

1

2

3
#pragma mark A的.m中

// 指定代理,B就是customView

customView .delegate = self;

第五步:在A的延展或者A的.h文件中导入协议名称<协议名称>

?

1

2

3

4
#pragma mark A的.m的延展里,A就是RootTabBarController

// 协议导入

@interface RootTabBarController () <CustomTabBarDelegate>

@end

第六步:在A的.m中事项协议方法,取得参数中得知,呈现在当前界面上

?

1

2

3

4

5

6
#pragma mark A的.m

// 实现代理方法,这里就可以使用从B传来的值了

- (void)selectedIndexWithTag:(NSIngeter)tag

{

self.selectedIndex = tag;

}

使用Block页面间传值

第一步:在B的.h中重定义一个block,用这个重定义的block类型声明一个类的属性这里要注意用copy修饰block属性

?

1

2

3

4

5

6

7

8

9
#pragma mark B的.h

#import <UIKit/UIKit.h>

// block传值

// 重命名一个有参无返回值的block类型

typedef void(^passValue)(NSInteger tag);

@interface CustomTabBarView : UIView

//用这个block类型定义一个属性

@property (nonatomic,copy)passValue passValueTag;

@end

第二步:在B的.m的返回方法中调用block的方法

?

1

2

3
#pragma mark B的.m的返回方法中

//调用block方法

self.passValueTag(sender.tag - 1000);

第三步:在A的.m中创建B的实例的地方,为B的block属性赋值,也就是说,写好这个block中的内容,类似于给B的某一个属性赋初值

?

1

2

3

4

5
// 设置block内容

customView.passValueTag = ^(NSInteger tag)

{

self.selectedIndex = tag;

};

没有引用局部变量的Block内存存储在全局区

引用了局部变量的Block内存存储在栈区

当对Block进行copy操作的时候Block的内存存在堆区

Block的循环引用问题

当Block是self的一个属性的时候

self.circleBlock = ^(){my_self.navigationItem.title = @"Hello";};

会导致self的引用计数+1,最终导致循环引用

在ARC下使用weak修饰变量防止循环引用

在非ARC下使用block修饰变量防止循环引用

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持快网idc!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 详解iOS页面传值(顺传 逆传) https://www.kuaiidc.com/92059.html

相关文章

发表评论
暂无评论