前言
本文主要介紹了關于iOSios/300112.html">定義名為任意的變量的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
需求說明
在實際的編程過程中,我們總要定制一些控件,在定制的過程里,有時喜歡自己實現部分delegate方法
// MYScrollView.m- (instancetype)init{ ... self.delegae = self; ...}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"%s 我被執行", __func__); ...}
粗看上述的代碼沒什么問題, 可是當我們的其他對象也想實現delegate怎么辦呢?
// ViewController.m- (void)viewDidLoad { ... scrollView.delegate = self; ...}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"%s 執行了ViewController里的方法,就不執行MYScrollView的方法了", __func__); ...}
實現
有的同學會在ViewController里的方法里在調用一下UIScrollView的方法,可以我們不知道MYScrollView自己實現了那些delegate方法啊,只能每個都轉發一下了.
// ViewController.m- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ [(MYScrollView *)scrollView scrollViewDidScroll:scrollView]; ...}...
這樣做是不是很累?
Objective-C是一門oop的語言,oop的特性有哪些呢:多態.
可以用這特性去解決這一問題:
* 在子類里重寫delegate方法,在ViewController里調用的delegate其實是子類自己的myDelegate.
* 然后讓父類的delegate指向自己.在子類里實現的delegate方法里調用子類的delegate的方法.
// MYScrollView.m@synthesize delegate = _myDelegate;- (instancetype)init{ ... [super setDelegate:self]; ...}// 需要掛鉤多少delegate方法就寫多少- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"%s 我先執行", __func__); [self.delegate scrollViewDidScroll:scrollView];}// ViewController.m- (void)viewDidLoad { ... scrollView.delegate = self; ...}- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"%s 我接著被執行了", __func__); ...}
這樣子類和ViewController里的delegate方法都被執行了.
奇巧有了,按照慣例得說說無益了.
嘗試寫個MYTableView.寫完后發現,尼瑪的DataSource的方法可以掛鉤,Delegate的卻失敗了.
// 筆者用的是tableView:cellForRowAtIndexPath: 和numberOfSectionsInTableView: 兩個方法
UITableView繼承自UIScrollView,UIScrollViewDelegate的方法卻成功了.
筆者猜測造成這樣的原因可能是UITableView內部用的是self.delegate和_dataSource去執行UITableView協議里的方法.
方法能不能成功,取決于我們看不到的apple的代碼,這個技巧還怎么去用呢.
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答