效果圖1
效果圖2
其實一般是在第一種情況使用的UISearchController,但是第二種情況這種又懶得去用uisearchbar+uitableview等等去處理,
其實主要是對數據源的合理使用即可
UISearchController通常是用來排查數據的,比如當前的uitableviewcontroller有許多數據,排查之后需要更新顯示數據。
首先UISearchController是聯通主cntroller與結果controller橋梁
在主controller建立UISearchController對象
@interface UIViewControllerLocation (){ UISearchController* searchController0;}
那么如何聯通主controller
CGRect rectBar=CGRectMake(0, 0, self.view.frame.size.width, 44);
[searchController0.searchBar setFrame:rectBar];
[self.searchBar addSubview:searchController0.searchBar];
以上代碼需要理解的是searchController0.searchBar是一個只讀屬性,所以不能被assign,
self.searchBar是一個view
/** * 搜索框 */@PRoperty (weak, nonatomic) IBOutlet UIView *searchBar;
不能夠直接使用self.searchBar=searchController0.searchBar;只有tableview.tableHeaderView=searchController0.searchBar才有效果,同樣是view不知道為什么
還有比較重要的一點就是,即使模擬器可以正常的顯示,但是真機卻無法顯示searchBar(xcode7+iphone5s+ios8.3)
最終調試得出真機運行時searchController0.searchBar的frame是(0 0,0 0)需要重置frame才可以正常顯示
那么如何聯通結果controller
@interface UIViewControllerLocation (){ SearchResult* searchResult;}
searchResult=[SearchResult new]; searchController0=[[UISearchController alloc] initWithSearchResultsController:searchResult];
SearchResult是一個uitableviewcontroller
然后是主controller作為了結果controller的數據更新者
searchController0.searchResultsUpdater=self;
需要遵循一個代理
@interface UIViewControllerLocation : UIViewController<UISearchResultsUpdating>
然后
//設置活躍性為YES否則需要自行推送結果controller searchController0.active=YES;
那么主controller如何推送數據到 結果 controller
代理
/** * 當搜索框開始改變時觸發 * * @param searchController */-(void)updateSearchResultsForSearchController:(nonnull UISearchController *)searchController{ searchResult.getResult(@[@70,@71,@72,@73,@74,@75]);}
結果controller需要處理接受到的數據(使用的block)
#import <UIKit/UIKit.h>#import "NSObjectDataSource.h"/** * 獲取數據 * * @param idData */typedef void (^GetResult)(id idData);@interface SearchResult : UIViewController/** * 獲取數據的block */@property(nonatomic,copy)GetResult getResult;/** * 查詢數據列表 */@property (weak, nonatomic) IBOutlet UITableView *tabelview;/** * tableview的datasource代理 */@property(nonatomic,retain)NSObjectDataSource* dataSource;@end
主controller里初始化結果controller的獲取數據block
SearchResult*__weak weakSearchResult=searchResult; searchResult.getResult=^(NSArray* array) { weakSearchResult.dataSource.nsArrayModels=array; [weakSearchResult.tabelview reloadData]; };
在主controller里搜索更新時執行就可以了(只傳遞最終數據,數據的篩選需要自行處理)
新聞熱點
疑難解答