Copyright ? 2017年ZaneWangWang. All rights reserved.
如果你看到的不是原文請到原文查看
一. 視圖控制器之間傳值
1. vc_A push或者模態到vc_B
分析: 這種情況能夠在vc_A中直接得到vc_B的對象,可以直接將要賦的值給vc_B的一個可訪問屬性即采用屬性傳值
例如:在vc_A的tableview的點擊選中方法中賦值
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
? ? ? ? ? UIViewController *vc_B = ....
? ? ? ? ? vc_B.dataModel = vc_A.dataSource[indexPatch.row];
? ? ? ? ? [vc_A push或者present到vc_B];
}
2. vc_B pop或者 dismiss到vc_A
分析: 反向傳值應用非常廣泛可以用到代理或者是block傳值,當然也可以使用通知(不怎么常用通知,這里就不在介紹通知),如果是通過導航完成的跳轉或者模態又或者vc_A是在storyboard文件中的也可以直接獲取對象給對象的可訪問屬性賦值
例如:
1>.代理傳值(這里是非正式代理)
vc_B中需要寫一個傳值的代理方法,一個代理的屬性
#import <UIKit/UIKit.h>
@protocol vc_BDelegate<NSObject>
@required(必須)/@optional(可選)
- (void)sendBackValue: (id) aValue;
@end
@interface vc_B : UIViewController
@property (nonatomic, weak(這里防止循環引用)) id<vc_ADelegate> delegate;
@end
跳轉到vc_B的時候需要給vc_B的代理屬性賦值,并且vc_A需要遵守vc_B的代理,vc_A還要實現vc_B的代理方法
#import "vc_A.h"
@interface vc_A:UIViewController()<vc_BDelegate>
@end
UIViewController *vc_B = ....
vc_B.delegate = self(這里的self表示的vc_A對象);
[vc_A push或者present到vc_B];
- (void)sendBackValue: (id) aValue{
//這里處理回調的任何操作
}
以上是代理的準備工作,接著搞定反向傳值的傳值時機,即在什么時候觸發代理方法
假如vc_B中有如下的點擊事件
- (void)btnClick:(UIButton *)sender{
//觸發代理對象調用代理方法并傳值
[_delegate? sendBackValue:(想要傳的值)];
}
2>.block傳值
vc_B中需要寫一個block屬性如下
@interface vc_B : UIViewController
@property (nonatomic, copy) void(^sendBackBlock)(id value);
@end
vc_A跳轉到vc_B的時候實現block
UIViewController *vc_B = ....
vc_B.sendBackBlock = ^(id value){
//這里來處理回調,你可以在這里在規則之內為所欲為
};
[vc_A push或者present到vc_B];
以上是block的準備工作,接著搞定反向傳值的傳值時機,即在什么時候觸發block方法
假如vc_B中有如下的點擊事件
- (void)btnClick:(UIButton *)sender{
//觸發block反向傳值
if(_sendBackBlock){
_sendBackBlock(這里是你要傳的參數);
}}
二. 視圖控制器與其view上自定義子控件的傳值
分析:這里拿tableView的cell舉例說明,一般有兩種情況:一個是從視圖控制器給cell賦值另一個是從cell傳事件和值到視圖控制器
1>.從視圖控制器給cell賦值
自定義cell要添加一個相對應的model屬性
#import <UIKit/UIKit.h>
@class RapairRecordModel;
@interface MyMessageDetaileTableViewCell : UITableViewCell
@property (nonatomic, weak) RapairRecordModel *model;
@end
配置cell的時候給cell的model賦值
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
MyMessageDetaileTableViewCell(這個是自定義的cell) *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.model = _dataSource[indexPath.row];//這里是賦值的關鍵
return cell;
}
給cell的model賦值的時候會觸發cell的model屬性set方法,那我們重寫此方法即可
//這是在cell的實現文件里的
- (void)setModel:(RapairRecordModel *)model{
//在這里你可以個cell的任何你想你需要的控件賦值
}
2>.從cell傳事件和值到視圖控制器
我這里是做了一個點擊放大cell上圖片的操作,使用的傳事件和值的方式是block
首先創建一個block屬性
#import <UIKit/UIKit.h>
@class RapairRecordModel;
@interface MyMessageDetaileTableViewCell : UITableViewCell
@property (copy, nonatomic) void(^ClicKImage)(UIView *view,UIImageView *imageView,RapairRecordModel *model);
@end
配置cell的代理方法中實現cell的block處理回調操作
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
MyMessageDetaileTableViewCell(這個是自定義的cell) *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.ClicKImage = ^(UIView *view, UIImageView *imageView, RapairRecordModel *model){
//這里處理回調操作
[ShowImagesManager shareManagerWithTapImageView:imageView withCurrentImageIndex:imageView.tag withTapImageViewSuperView:view withSourceImageUrls:imageUrls];
};
return cell;
}
cell上點擊圖片觸發block回調
- (void)showDetaileImage:(UITapGestureRecognizer *)tap{
if (_ClicKImage) {
UIImageView *imageView = (UIImageView *)tap.view;
_ClicKImage(_imagesSuperView,imageView,_model);
}}