• ViewController之间如何传值


    按照这篇博文,ViewController之间传值的方法有十种之多。

    我在这段时间用到了三种方法:
    以下论述均假定:A控制器传值给B控制器

    1.extern

    extern方法是最简单的。
    在A控制器.m文件@Implementation字头前声明变量,例如NSString *str;
    在B控制器.m文件@Implementation字头前声明变量extern NSString *str;
    然后就可以在B控制器中直接调用str

    2.NSUserDefaults

    NSUserDefaults其实和归档类似。就是在A控制器.m文件中归档要传值的参数。

    NSData *encodedStr = [NSKeyedArchiver archivedDataWithRootObject:Astr];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:encodedStr forKey:@"str"];
    

    然后在B控制器中解档调用。

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *decodedStr = [defaults objectForKey:@"str"];
    if (Bstr == nil) {
        Bstr = [[NSString alloc]init];
    }
    if(encodedStr == nil {
        NSMutableArray *newStr = [[NSString alloc] init];
        Bstr = newStr;
    }else{
        Bstr = (NSMutableArray *)[NSKeyedUnarchiver unarchiveObjectWithData:decodedStr];
    }
    

    3.设置委托

    在A控制器.h文件@Interface字头前设置代理:

    @protocol AtoBDelegate <NSObject>
    @required
    - (NSString *)doWith:(NSString *)parameter;
    @end
    

    在A控制器.h文件中设置属性:

    @property id<AtoBDelegate> delegate;
    

    并在A控制器.h文件中执行方法:

    [self.delegate doWith:(NSString *)parameter];
    

    而在B控制器中引入A的.h文件#import "A.h"并添加代理<AtoBDelegate>,然后在.m文件中指定代理

    [(A *)*a setDelegate:self];//(A  *)只是表明类型,实际中不用出现
    

    声明方法

    - (NSString *)doWith:(NSString *)parameter{
         self.Btr = [self doWith:(NSString *)str];
    }
    

    当(A *)a在B控制器的.m文件中执行doWith:Astr方法时即实现传值。


    我在写浏览器代码时并没用代理方法实现控制器之间的传值。而是在UICollectionView与UICollectionViewCell交互时用到这个方法。在UITableView中,官方提供了indexPathForSelectedRow可以返回indexPath,从而删除选定行。但在UICollectionView只有indexPathsForSelectedItems返回数组,无法返回单个indexPath。所以要实现删除选定单元就只能另辟蹊径。

    我参考了Stackoverflow答案
    http://stackoverflow.com/a/23095967/5243422
    遵循 UICollectionViewCell请求UICollectionView删除自己 的思路,解决了这个问题。

  • 相关阅读:
    主流配置中心的比较 Spring Cloud Config、Apollo、Nacos
    css进阶之路(一)----Web标准
    hello world
    服务过美国总统竞选的非传统投票UI [解析及DEMO]
    服务过美国总统竞选的非传统投票UI【demo已放出】
    大公司移动前端开发面试题——做转盘[参考代码]
    大公司移动前端开发面试题——做转盘[参考代码已放出]
    【前端杂谈】细数前端优化的化零为整
    前端开发的七宗罪
    CentOS7环境下在/离线安装GCC与GCC-C++
  • 原文地址:https://www.cnblogs.com/rim99/p/5009904.html
Copyright © 2020-2023  润新知