day5---傳值

A->B 正向傳值 (使用屬性傳值)
B->A 反向傳值
1.代理傳值
2.單例傳值
3.Block傳值

MVC設計模式

一 代理傳值

委托者:   1)制定協議   (在委托者的 .h 文件里指定)
        2)聲明協議指針id<xxDelegate>delegate
        3)調用協議方法
代理者 1)遵守協議  (代理者遵守協議的同時,在轉場事件里指定代理人 
                            vcr.delegate =self)
        2)實現協議方法

見【Demo】-【1-Delegate】

1.指定協議和聲明協議指針
@protocol SecondViewControllerDelegate <NSObject>
-(void)postValue:(NSString *)text;
@end

@interface SecondViewController : UIViewController
//2.聲明代理指針
//代理指針官方推薦使用assign修飾,原因是為了防止循環引用導致內存泄露
@property(nonatomic,assign)id<SecondViewControllerDelegate> delegate;
@end

3.調用協議
-(void)btnClick{
UITextField *field = (UITextField *)[self.view viewWithTag:100];
//調用協議方法(開始傳值)
//調用協議方式是為了保證代碼的安全性,最好先進行判斷
if ([self.delegate respondsToSelector:@selector(postValue:)]) {
//如果代理人實現了方法則調用
[self.delegate postValue:field.text];
}
[self dismissViewControllerAnimated:YES completion:nil];
}

4.遵守協議和指定代理人
指定代理人是在跳轉按鈕事件中添加 vcr.delegate = self; 【關鍵】

5.實現協議方法
//2.實現協議方法

pragma mark -SecondViewControllerDelegate

-(void)postValue:(NSString *)text{
UILabel *label = (UILabel *)[self.view viewWithTag:100];
//把傳過來的值賦值給label顯示出來
label.text = text;
}

二 單例傳值 (appDelegate 在一個程序中是唯一的)
AppDelegate *app = [[UIApplication sharedApplication] delegate];

單例對象:保證該對象在整個工程中僅有唯一的一個對象,所以單例對象存儲的數據可以達到整個工程所共享;

什么時候用代理?什么時候用單例?
答: 代理,單例都能實現頁面的反向傳值;

    單例對象是整個工程所共享的,所以單例對象里存儲的數據可以被整個工程所共享,當大量類之間要共享數據的時候,使用單例;
    
    代理傳值,適合一對一的頁面傳值;

    從內存角度來分析,單例對象比較特殊,生命周期是在程序退出的時候才銷毀,故不宜濫用單例對象,避免內存浪費;

AppDelegate
在某種意義上,認為AppDelegate的本質其實也是一個單例對象,在整個應用程序中是唯一的,因為當前應用程序對象UIApplication對象是唯一的,那么UIApplication對象的代理人是唯一的,而這個代理人就是AppDelegate,故AppDelegate事一個唯一的代理對象,即是一個單例對象;

如何獲得這個AppDelegate對象呢?
AppDelegate *app =  [[UIApplication sharedApplication] delegate];

-(void)btnClick{

UITextField *field = (UITextField *)[self.view viewWithTag:100];
//用appDelegate這個單例丟向進行傳值
//拿到應用程序對象,通過應用程序對象拿到它的代理對象
AppDelegate *app =  [[UIApplication sharedApplication] delegate];
app.message = field.text;                  【利用工程代理人的唯一性來傳值】

// //拿到唯一的單例對象
// Singleton *sing = [Singleton shareSingLeton]; 【自定義的單例】
// //開始存儲數據
// sing.text = field.text;

[self dismissViewControllerAnimated:YES completion:nil];

}

-(void)viewWillAppear:(BOOL)animated{ 【在視圖將要出現的方法里重新賦值】
[super viewWillAppear:animated];
UILabel *label = (UILabel *)[self.view viewWithTag:100];
//拿到唯一的應用程序對象所對應的代理對象
AppDelegate *app = [[UIApplication sharedApplication] delegate];
label.text = app.message;

// //獲取唯一的單例對象
// Singleton *sing = [Singleton shareSingLeton];
// //取出數據,并在label上展示
// label.text = sing.text;
}

三 使用Block代碼塊實現反向傳值

void(^myBlock)() = ^{

};


int (^sumBlock)(int,int)=
^(int a,int b){

    return a+b;
};


typedef int(^MyBlock)(int a,int b);
MyBlock block1 = ^(int a,int b){
    return a+b;
};

將Block作為屬性進行傳值

1.在視圖的 .h文件里添加Block屬性
typedef void(^MyBlock)(NSString *message);
@interface SecondViewController : UIViewController
//把block聲明成屬性;
@property(nonatomic,copy)MyBlock block;
@end

2.在視圖的 .m文件的按鈕事件里給Block參數賦值,進行傳值;
-(void)btnClick{
UITextField *field = (UITextField *)[self.view viewWithTag:100];
//回調(調用代碼塊,實現傳值的功能)
self.block(field.text);
[self dismissViewControllerAnimated:YES completion:nil];
}

3.在上一個視圖里的跳轉按鈕的事件里面添加以下代碼:
SecondViewController *vcr = [[SecondViewController alloc] init];
vcr.block = ^(NSString *message){
//凡是在block代碼塊內訪問外面的對象,那么該對象用__block去修飾;
label.text = message;

};

四 MVC設計模式
iOS程序都采用MVC設計模式為基礎設計模式,即一個程序的構成,由數據模型,視圖,視圖控制器。。

M:模型 model,負責存儲數據,處理數據,相關的業務邏輯,網絡通訊,多線程處理,文件操作等。。

V:視圖 View ,只負責顯示界面,展示數據;

C:視圖控制器 controller ,負責將M和V關聯起來,將M中的數據傳給V顯示,也負責將V接受的用戶操作反饋給M。。
是M和V之間溝通的一個渠道。


好處:功能模塊化,減少代碼之間的依賴性,耦合性
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容