ios 對UISearchController的封裝使所有的回調(diào)使用Block

在之前的一片文章UISearchController中介紹了UISearchController的使用弛秋,可以看到其中涉及到很多的委托,在使用UISearchController的時候需要導(dǎo)入相關(guān)的協(xié)議,設(shè)置代理蝙搔,然后實現(xiàn)協(xié)議中的方法。每次都這樣寫還是比較麻煩的。所以可以對UISearchController做一次封裝毯欣。將遵循協(xié)議、設(shè)置代理臭脓、實現(xiàn)方法這套流程放在UISearchController的子類中來實現(xiàn)酗钞,子類對外暴露一組Block屬性。這樣代理方法的要實現(xiàn)的功能就可以通過Block來完成啦。

YBSearchController.h文件

#import <UIKit/UIKit.h>

@interface YBSearchController : UISearchController

/**
 設(shè)置是否一直顯示搜索結(jié)果頁面
 */
@property (nonatomic) BOOL alwaysShowResultsViewController;

/**
 - (void)updateSearchResultsForSearchController:(UISearchController *)searchController
 */
@property (nonatomic,copy) void(^updateSearchResultsForSearchController)(UISearchController *searchController);

/**
 - (void)willPresentSearchController:(UISearchController *)searchController
 */
@property (nonatomic,copy) void(^willPresentSearchController)(UISearchController *searchController);

/**
 - (void)didPresentSearchController:(UISearchController *)searchController
 */
@property (nonatomic,copy) void(^didPresentSearchController)(UISearchController *searchController);

/**
 - (void)willDismissSearchController:(UISearchController *)searchController
 */
@property (nonatomic,copy) void(^willDismissSearchController)(UISearchController *searchController);

/**
 - (void)didDismissSearchController:(UISearchController *)searchController
 */
@property (nonatomic,copy) void(^didDismissSearchController)(UISearchController *searchController);

/**
 - (void)presentSearchController:(UISearchController *)searchController
 */
@property (nonatomic,copy) void(^presentSearchController)(UISearchController *searchController);

/**
 - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
 */
@property (nonatomic,copy) void(^searchBarSearchButtonClicked)(UISearchBar *searchBar);

/**
 - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
 */
@property (nonatomic,copy) void(^searchBarCancelButtonClicked)(UISearchBar *searchBar);

@end

YBSearchController.m文件

#import "YBSearchController.h"

@interface YBSearchController ()<UISearchControllerDelegate,UISearchResultsUpdating,UISearchBarDelegate>

@end

@implementation YBSearchController

- (void)dealloc
{
    @try
    {
        // 此處可能多次刪除KVO導(dǎo)致崩潰砚作,目前沒有找到更好的解決辦法所以使用@try @catch 語句塊防止程序崩潰
        if (self.alwaysShowResultsViewController && self.searchResultsController) {
            [self.searchResultsController.view removeObserver:self forKeyPath:@"hidden"];
        }
    }
    @catch (NSException *e) {
        NSLog(@"刪除KVO報錯");
        NSLog(@"%@",e);
    }
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.delegate = self;
    self.searchBar.delegate = self;
    self.searchResultsUpdater = self;
    
    if (self.alwaysShowResultsViewController && self.searchResultsController) {
        [self.searchResultsController.view addObserver:self forKeyPath:@"hidden" options:0 context:NULL];
    }
}

// 監(jiān)聽 self.searchController.searchResultsController.view 的hidden屬性窘奏,讓搜索結(jié)果頁面一直顯示
- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    if ( object == self.searchResultsController.view && [keyPath isEqualToString:@"hidden"] && self.searchResultsController.view.hidden && self.searchBar.isFirstResponder )
    {
        self.searchResultsController.view.hidden = NO;
    }
}

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
    self.updateSearchResultsForSearchController ? self.updateSearchResultsForSearchController(self) : nil;
}

- (void)willPresentSearchController:(UISearchController *)searchController
{
    self.willPresentSearchController ? self.willPresentSearchController(self) : nil;
}

- (void)didPresentSearchController:(UISearchController *)searchController
{
    self.didPresentSearchController ? self.didPresentSearchController(self) : nil;
}

- (void)willDismissSearchController:(UISearchController *)searchController
{
    self.willDismissSearchController ? self.willDismissSearchController(self) : nil;
}

- (void)didDismissSearchController:(UISearchController *)searchController
{
    self.didDismissSearchController ? self.didDismissSearchController(self) : nil;
}

- (void)presentSearchController:(UISearchController *)searchController
{
    self.presentSearchController ? self.presentSearchController(self) : nil;
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    self.searchBarSearchButtonClicked ? self.searchBarSearchButtonClicked(self.searchBar) : nil;
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
    self.searchBarCancelButtonClicked ? self.searchBarCancelButtonClicked(searchBar) : nil;
}

@end

注意點

  • YBSearchControllerUISearchController的子類。所以使用方法與UISearchController的使用方法一樣葫录,只是在需要使用UISearchController的代理方法的時候改成了我們封裝的Block屬性來實現(xiàn)蔼夜。

  • 在上面的YBSearchController.m方法中我們可以看到為了讓搜索結(jié)果頁面searchResultsController一直顯示我們使用到了KVO技術(shù)。來監(jiān)聽searchResultsController.viewhidden屬性并在監(jiān)聽的回調(diào)方法observeValueForKeyPath: ofObject: change: context:中設(shè)置self.searchResultsController.view.hidden = NO压昼。這個地方有一點需要注意那就是:“在使用KVO的時候可能會造成死循環(huán)”求冷。因為我們監(jiān)聽的是self.searchResultsController.viewhidden屬性變化,那么當(dāng)我們在監(jiān)聽的回調(diào)方法中改變這個hidden屬性又會被監(jiān)聽到然后再調(diào)一次回調(diào)方法.........窍霞。這樣就造成了循環(huán)調(diào)用匠题。為了解決這個問題我們需要在改變hidden屬性值的地方加上一個判斷如下面的代碼。當(dāng)hidden等于true的時候就不在改變hidden的屬性啦

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (self.searchResultsController.view.hidden && object == self.searchResultsController.view && [keyPath isEqualToString:@"hidden"] &&  self.searchBar.isFirstResponder )
    {
        self.searchResultsController.view.hidden = NO;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末但金,一起剝皮案震驚了整個濱河市韭山,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冷溃,老刑警劉巖钱磅,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異似枕,居然都是意外死亡盖淡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門凿歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褪迟,“玉大人,你說我怎么就攤上這事答憔∥对撸” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵虐拓,是天一觀的道長心俗。 經(jīng)常有香客問我,道長蓉驹,這世上最難降的妖魔是什么城榛? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮戒幔,結(jié)果婚禮上吠谢,老公的妹妹穿的比我還像新娘土童。我一直安慰自己诗茎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敢订,像睡著了一般王污。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上楚午,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天昭齐,我揣著相機(jī)與錄音,去河邊找鬼矾柜。 笑死阱驾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怪蔑。 我是一名探鬼主播里覆,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缆瓣!你這毒婦竟也來了喧枷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤弓坞,失蹤者是張志新(化名)和其女友劉穎隧甚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渡冻,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡戚扳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了族吻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咖城。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呼奢,靈堂內(nèi)的尸體忽然破棺而出宜雀,到底是詐尸還是另有隱情,我是刑警寧澤握础,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布辐董,位于F島的核電站,受9級特大地震影響禀综,放射性物質(zhì)發(fā)生泄漏简烘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一定枷、第九天 我趴在偏房一處隱蔽的房頂上張望孤澎。 院中可真熱鬧,春花似錦欠窒、人聲如沸覆旭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽型将。三九已至寂祥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間七兜,已是汗流浹背丸凭。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留腕铸,地道東北人惜犀。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像狠裹,于是被迫代替她去往敵國和親向拆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容