• 页面传值。顺传,逆传。


    代理协议传值

    顺传

    假设A为第一个视图控制器,B为第二个视图控制器
    在A中导入B的.h文件
    场景:A向B传值
    第一步:在B的.h中定义一个content属性

    @interface SecondViewController : UIViewController
    @property(nonatomic,copy)NSString *contents;
    @end
    

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

    - (void)buttonAction:(UIButton *)button
     {
     	NSLog(@"进入第二页");
     	SecondViewController *secondVC = [SecondViewController alloc] init];
     	secondVC.contents = self.label.text;
     	[self.navigationController pushViewController:secondVC animated:YES];
     }
    

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

    @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;

    #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 协议方法名:(参数,也就是要传回的数据)

    #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此时会有黄色警告,因为没有准守协议

    #pragma mark A的.m中
    // 指定代理,B就是customView
    customView .delegate = self;
    

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

    #pragma mark A的.m的延展里,A就是RootTabBarController
    // 协议导入
    @interface RootTabBarController () <CustomTabBarDelegate>
    @end
    

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

    #pragma mark A的.m
    // 实现代理方法,这里就可以使用从B传来的值了
    - (void)selectedIndexWithTag:(NSIngeter)tag
     {
     		self.selectedIndex = tag;
     }
    

    使用Block页面间传值

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

    #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的方法

    #pragma mark B的.m的返回方法中  
    //调用block方法  
    self.passValueTag(sender.tag - 1000);
    

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

    // 设置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修饰变量防止循环引用

  • 相关阅读:
    手机摇一摇代码
    ftp
    .net 设置导航的当前状态
    app 尺寸
    繁简体 互转 js
    静态页分页效果
    判断浏览器
    python列表,元组,字典和字符串之间的相互转换
    uliweb框架数据库操作
    uliweb的模版
  • 原文地址:https://www.cnblogs.com/Dog-Ping/p/6127280.html
Copyright © 2020-2023  润新知