iOS 視圖控制器傳值方式總結

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

}}

總結:以上簡單的介紹了視圖控制器包含的傳值方式和實現.方法沒有好壞之分,只要邏輯清晰條理分明代碼規范保證性能的前提下實現功能,靈活使用才是關鍵.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • iOS網絡架構討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,257評論 1 23
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,216評論 30 472
  • 代碼創建UIWindow對象 Xcode7之后使用代碼創建UIWindow對象: //創建UIWindow對象 s...
    云之君兮鵬閱讀 1,370評論 0 2
  • 1.OC里用到集合類是什么? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,395評論 0 3
  • 明日我的花店將要開張,回到花店一看,花門的架子沒搭起來,花籃沒做好,我的打卡尚未開始。每件事情都是一定要完成,而我...
    楚楚云兒閱讀 403評論 0 0