IOS 代理協議傳值

來源:互聯網
上載者:User

標籤:int   修飾符   就是   cti   send   gpo   問題   tor   show   

順傳

假設A為第一個視圖控制器,B為第二個視圖控制器

在A中匯入B的.h檔案

情境:A向B傳值

第一步:在B的.h中定義一個content屬性

@interfaceSecondViewController:[email protected](nonatomic,copy)NSString*contents;@end

第二步:在點擊A中的按鈕方法裡面給B的content屬性賦值

- (void)buttonAction:(UIButton*)button {NSLog(@"進入第二頁");    SecondViewController *secondVC = [SecondViewController alloc] init];    secondVC.contents =self.label.text;    [self.navigationController pushViewController:secondVC animated:YES]; }

第三部:在B使用content的屬性給相應的控制項賦值

@implemention SecondViewController- (void)viewDidLoad {    [superviewDidLoad];self.view.backgroundColor = [UIColorwhiteColor];self.navigationItem.title =self.contents; }

逆傳

代理傳值使用在兩個介面傳值的之後,從後向前傳值。

假設A為第一個視圖控制器,B為第二個視圖控制器

情境:B向A傳值

第一步:首先在B的.h檔案中聲明協議和協議方法

第二步:在B的.h中聲明一個代理屬性,這裡主要注意用assign或weak修飾,weak和assign是一種非擁有關係的指標,通過這兩種修飾符修飾的指標變數,都不會改變被引用的對象的引用計數。但是在一個對象被釋放後,weak會自動將指標指向nil,而assign則不會。所以,用weak更安全些。

@property (nonatomic,weak)id<協議名>delegate;

#pragma mark 這裡是B的.h#[email protected]// 把btn的tag傳出去的方法- (void)selectedIndexWithTag:(NSInteger)tag;@[email protected]:UIView//聲明一個代理屬性[email protected](nonatomic,weak)iddelegate;@end

第三部:在B即將POP回前一個介面的時候,在pop方法的上一行使用協議方法傳遞資料[self.delegate 協議方法名:(參數,也就是要傳回的資料)

#pragma mark 這裡是B的.m// 判斷在制定的代理類中是否實現了該協議方法// 確保執行時無此方法時不崩潰if([self.delegate respondsToSelector:@selector(selectedIndexWithTag:)]){// 執行代理方法[self.delegate selectedIndexWithTag:(sender.tag -1000)];}else{NSLog(@"協議中的方法沒有實現");}

在A的.m中,在push到B介面方法之前,B對象的初始化之後,指定A對象為B對象的代理(B對象).delegate = self此時會有黃色警告,因為沒有準守協議

#pragmamark A的.m中// 指定代理,B就是customViewcustomView .delegate=self;

第五步:在A的延展或者A的.h檔案中匯入協議名稱<協議名稱>

#pragma mark A的.m的延展裡,A就是RootTabBarController// 協議匯入@interfaceRootTabBarController() @end

第六步:在A的.m中事項協議方法,取得參數中得知,呈現在當前介面上

#pragma mark A的.m// 實現代理方法,這裡就可以使用從B傳來的值了- (void)selectedIndexWithTag:(NSIngeter)tag {self.selectedIndex = tag; }

使用Block頁面間傳值

第一步:在B的.h中重定義一個block,用這個重定義的block型別宣告一個類的屬性這裡要注意用copy修飾block屬性

#pragma mark B的.h #import// block傳值  // 重新命名一個有參無傳回值的block類型  typedefvoid(^passValue)(NSIntegertag);@interfaceCustomTabBarView:UIView//用這個block類型定義一個屬性  @property(nonatomic,copy)passValue passValueTag;@end

第二步:在B的.m的返回方法中調用block的方法

#pragmamark B的.m的返回方法中  //調用block方法self.passValueTag(sender.tag -1000);

第三步:在A的.m中建立B的執行個體的地方,為B的block屬性賦值,也就是說,寫好這個block中的內容,類似於給B的某一個屬性賦初值

// 設定block內容  customView.passValueTag = ^(NSIntegertag)    {self.selectedIndex = tag;    };

沒有引用局部變數的Block記憶體儲存在全域區

引用了局部變數的Block記憶體儲存在棧區

當對Block進行copy操作的時候Block的記憶體存在堆區

Block的循環參考問題

當Block是self的一個屬性的時候

self.circleBlock = ^(){my_self.navigationItem.title = @"Hello";};

會導致self的引用計數+1,最終導致循環參考

在ARC下使用weak修飾變數防止循環參考

在非ARC下使用block修飾變數防止循環參考

 

IOS 代理協議傳值

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.