1. 程式人生 > >iOS中協議delegate的傳值注意點

iOS中協議delegate的傳值注意點

1、iOS中協議的用途一般是用來進行反向傳值,一般步驟如下:

1)宣告協議

@protocol ThirdDalegate <NSObject>

-(void)printNum:(int)num;//自定義方法用來反向傳值

@end

2)定義協議屬性

@property(nonatomic,assign)id<SecondDalegate>delegate;//定義屬性delegate

3)實現協議方法

//一般先判斷協議方法是否已響應(即是否有其他類遵從本類的協議)

if ([self.delegaterespondsToSelector:@selector(printNum:)]) {

        [self.delegateprintNum:1];//進行傳值

    }

4)代理類接收值(傳值的類可以理解成委託類)

@interface ViewController ()<SecondDalegate>

- (void)viewDidLoad {

SecondViewController * second=[[SecondViewControlleralloc]init];

second.delegate=self;

}

-(void)printNum:(int)num{

NSLog(@"%d",num);

}

ps:以上為正常情況下的協議反向傳值,是最協議最常見的用法

2、但是有時候我們會想要自定義控制元件,類似UITableView,那麼此時單純的反向傳值已經滿足不了該需求,因為我們需要在初始化該控制元件的時候利用協議傳值到該控制元件內部,類似UITableView的numberOfRowsInSection設定cell數量的這種方法。

1)在委託類中宣告協議

@protocol ThirdDelegate <NSObject>

-(NSInteger)ViewWithNum;

@end

2)協議屬性

@property(nonatomic,assign)id<ThirdDelegate>delegate;

-(

instancetype)initWithFrame:(CGRect)frame andDelegate:(id)delegate;

//一般在控制元件初始化的時候就傳入代理類,以協議方法由於順序原因不響應

@end

3)在代理類中實現傳值

@interface ViewController ()<ThirdDelegate>

- (void)viewDidLoad {

    TempView * tempV=[[TempViewalloc]initWithFrame:self.view.boundsandDelegate:self];

    [self.viewaddSubview:tempV];

}

-(NSInteger)ViewWithNum{

return 3;

}

4)自定義控制元件實現初始化方法

-(instancetype)initWithFrame:(CGRect)frame andDelegate:(id)delegate{

self=[superinitWithFrame:frame];

if (self) {

self.backgroundColor=[UIColorredColor];

self.delegate=delegate;//注意點:必須先遵從協議才能響應方法  

if ([self.delegaterespondsToSelector:@selector(ViewWithNum)]) {

NSLog(@"%ld",(long)[self.delegateViewWithNum]);

        }

    }

return self;

}



相關推薦

iOS協議delegate注意

1、iOS中協議的用途一般是用來進行反向傳值,一般步驟如下: 1)宣告協議 @protocol ThirdDalegate <NSObject> -(void)printNum:(

iOS的屬性和委託模式

    iOS中常用的傳值模式有很多中,然而我們在學習階段用的比較多的傳值方式,就是屬性傳值以及委託協議傳值,或者通知方式的傳值模式,但是,我這裡主要根據自己在學習過程中學習理解到的兩種常用傳值模式。    一是,屬性傳值模式,我簡單的根據自己在

SpringMVC的前後臺注意事項

1.前臺設定contentType:"application/x-www-form-urlencoded",前臺是JSON物件,後臺接收方法可以是字串、物件。示例如下: function remoteService(url,postData) {var res = ""

iOS delegate 步驟

iOS  delegate 傳值步驟  A.h @protocol  MyDelegate - (void )mjFuncWithString:(NSString*)str; @end @int

PHP關於href和取的問題

問題:在網頁開發過程中或多或少都會遇見如:index.php?id=1&page=2這類的東西,那麼我們如何在index.php中把傳過來的值獲取到呢? 下面是在javascript中獲取href傳過來的值: 方法一:用正則表示式 function getQueryStrin

iOS五種頁面方式

頁面傳值是很常用的一個東西,這裡介紹比較常用的五種:屬性傳值,block傳值,代理傳值,單例傳值,通知傳值。 (一)屬性傳值  實踐方案:第二個介面中的lable顯示第一個介面textField中輸入的文字 實踐步驟: 首先我們建立一個RootViewControlle

解決使用echarts做動態資料餅圖展示data如何的問題

** 解決使用echarts做動態資料餅圖展示中data如何傳值的問題 ** 如圖,將所查出的資料以餅圖形式展示 下面是頁面data的傳值方法 這是data,請忽略data裡的那些值。那是用來測試用的, 首先將從資料庫查出的資料裝到兩個list裡面,再通過json傳到前臺。

angular父子元件(一)

 子元件使用父元件的方法變數 使用ng g component 元件名稱下載兩個元件 ng g component components/father ng g component components/son   在根元件app.module.ts中引

Vue父子元件的方式

父元件向子元件傳值 父元件呼叫子元件時,在標籤上繫結動態屬性 <template> <div id='parent'> <v-child :title='title' :run='run'></v-child&g

vue父子元件

vue中,在子元件設定props物件,來接受父元件傳來的值 父元件中,:冒號後面的綠色變數必須和子元件中props的變數保持一致 子元件: type設定值的型別 default設定預設值,當沒有給子元件傳值時使用default裡的內容   子傳父: $emit 如果是子元件想傳

[iOS] WKWebView 於JavaScript

如果在專案中採用WKWebView的方法載入網頁,OC向JS傳值方法總結: 1、OC->JS 傳陣列的方法: NSString *arrStr = [self.arr componentsJoinedByString:@","]; NSString *js = [NSString string

專案遇到的坑和注意 總結 持續更新

gitHub地址: 傳送門 工作中遇到的坑和思考 有不同意見歡迎指正交流 前排推薦 https://github.com/topics/javascript 關注JS開源框架動態 勤於總結和思考 1. ajax請求的結果要和後端約定好返回的資料格式。

Java包裝類作用及注意

轉載地址: https://blog.csdn.net/liu_005/article/details/79585956 Java中對每種基本型別都有一個對應的包裝類,這裡主要講解包裝類的作用和包裝類使用時的一些注意點。 包裝類的作用 作用主要有以下兩方面:  - 編

C語言:函式引數的地址

任務程式碼: #include <stdio.h> void swap(int *a ,int *b)//按之前對指標認識,*a代表指標變數a,a儲存的是地址,*a是地址的值。 { //但是可以看到下面傳輸過程中swap(

ios 常用的一些方法和注意 componentsSeparatedByString componentsJoinedByString以及NSURl和NSURLComponents

將string字串轉換為array陣列  NSArray  *array = [Str componentsSeparatedByString:@","]; 注意://componentsSeparatedByString 這個方法有一個bug 當被切割的字串是 @“”

winform窗體的tag

1.窗體tag屬性 form1程式碼: form2  f2=new form2(); //f2.tag=要傳的值; //int為例 f2.tag=2; f2.show(); form2的程式碼: //tag為object型別,在使用時要轉化為要用的型別

web 專案a標籤(中文)到後臺的亂碼問題

      當點選下一頁出現亂碼問題: 因為title向Servlet傳輸的是中文,所以點選下一頁會出現亂碼問題解決方法: JSP:  <script type="text/javascript">    var href=$("#redirect

Angular父子元件@Input @Output @ViewChild最全面最簡單的總結

父元件傳遞給子元件: 值傳遞方式:@Input既可以傳遞資料也可以傳遞方法 傳遞資料(不舉例了) 傳遞方法 // 父元件定義方法 parentRun(){ alert('這是父元件的 run 方法'); } 呼叫子元件時傳入當前方法(是傳遞方法不是

函式new和delete的注意

來看一個典型的例子 關於指標的一些段錯誤,是因為記憶體釋放的不對,這條例子是符合要求的,因為指標 已經new出,完全可以使用delete將其釋放,在函式中傳入指標的時候,是可以進行記憶體 釋放的。 下一個例子 這個例子就有記憶體洩露的問題了。因為在函式中傳入的時

iOSdelegate的用法和規範

delegate是Objective-C編寫的應用中各種物件之間互相呼叫的主要方式之一. 通常情況下, 物件可以接收的訊息都通過在介面檔案中宣告的方法來表示. @protocol MyProtocol <NSObject> - (void)func; @en