iOS 的几种传值方法

这几种传值我们都以一个例子来说, 都是创建 两个 UITableViewController,点击其中其中一个 viewController 的 cell,然后获取相应的行数,传到另一个页面做进一步出来

1.block 传值

首先是block 的重定义
重定义在Second视图中,也就是要接受值的那个视图中

//声明 block 对 block 重定义 dataBlock 就相当于
//void (^)(NSString *str);
typedef void(^dataBlock)(NSString *str);

@interface SecondTableViewController : UITableViewController

//这里声明 block 的一个对象属性,方面调用
@property (copy,nonatomic) dataBlock dBlock;
//这里是对 Second 视图做单例处理,等会会细说
+(SecondTableViewController *)secondTVC;
//这里写一个方法,
-(void)readValueFromBlock;
@end

在 Second .m的方法中首先实现 read 方法

-(void)readValueFromBlock{
    self.dBlock = ^(NSString *str){
        cellText = str;//cellText 是用来接收block 传值过来的一个全局变量
        [self.tableView reloadData];//这里记得要刷新表格,不然值传过来了也显示不出来,必须写在 block 代码段内部
    };
}
//这个是单例化 SecondTableViewController

+(SecondTableViewController *)secondTVC{
    static SecondTableViewController *secondTVC = nil;
    if (secondTVC == nil) {
        secondTVC = [[SecondTableViewController alloc]init];
    }
    return secondTVC;
}

接下来就是在 First 里面进行调用 block 了


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//这个是获取 cell 选中行的 cell
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    SecondTableViewController *secondTVC = [SecondTableViewController secondTVC];
    //这里面就用前面SecondTableViewController单例的方法来初始化 这个视图.这么做的原因可以理解为:   通过 alloc 创建的视图控制器不再是原来的那个控制器,这样做就不能调用 Second 下面的 block 属性,也就没法再调用 block 方法传值,所以这里用单例来创建也正是利用了单例只能创建一个对象的特性

    [secondTVC readValueFromBlock];
    //这里在调用 dBlock 之前要调用一下block 的声明方法readValueFromBlock,不这样的话,系统还没执行到 second,会认为没有声明 block 对象,程序会崩溃的!!!

    secondTVC.dBlock(cell.textLabel.text);
    //这个就是调用 block属性来传值了
}

核心代码就是这么多了.可以下载源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值