首先貼上WMPageController的地址萍诱,也有swift版本哦,再次感謝作者的開源铭腕。:github地址:WMPageController
具體效果圖:
使用:
1柿究、具體引入方式,作者已經(jīng)寫得很清楚了孤里,支持手動和CocoaPods集成方式伏伯。代碼簡單容易上手。
2捌袜、實現(xiàn)方式:
創(chuàng)建一個控制器VC繼承自WMPageController, 可以通過兩種方式來初始化控制器
1.通過 Class 創(chuàng)建
使用以下方法創(chuàng)建控制器:
- (instancetype)initWithViewControllerClasses:(NSArray *)classes andTheirTitles:(NSArray *)titles;
其中说搅,Classes是要傳人顯示的控制器的類型,比如[UITableViewController class], titles是要顯示的控制對應(yīng)的標(biāo)題虏等。
這里需要注意的一點弄唧,當(dāng)你的WMPageController在tabbarController的時候适肠,初始化必須放在一起,在重寫- (instancetype)initWithViewControllerClasses:(NSArray *)classes andTheirTitles:(NSArray *)titles
這個方法是不可以的候引。如圖:
2.使用 datasource
使用方法和 UITableView 相似侯养,在子類中實現(xiàn)以下數(shù)據(jù)源方法即可:
- (NSInteger)numbersOfChildControllersInPageController:(WMPageController *)pageController;
- (__kindof UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index;
- (NSString *)pageController:(WMPageController *)pageController titleAtIndex:(NSInteger)index;
相對而言,第一種方法比較簡單省事背伴,我使用的是第一種方法集成沸毁。
但是這里有兩個地方需要注意一下:
1.假如你頂部切換tab有很多個childVC,你的根控制器又是在tabbarController里傻寂,在你初始化的時候息尺,很不方便,這時需要把所有的childVC都要引入進(jìn)來疾掰,導(dǎo)致本來tabbarController的VC就夠多了搂誉,在加上這些VC,顯得很亂静檬。所以作者有一個很好的辦法炭懊,設(shè)置你所需要的屬性,在調(diào)用一下reloadData方法就OK了拂檩。下圖的栗子:tab5個VC侮腹,第二個tab帶有頂部切換效果,還帶有三個childVC稻励,本來在設(shè)置tabbarController父阻,又引入了三個不一樣的VC。根據(jù)代碼簡潔之道望抽,這要寫不好加矛。
解決辦法:在你需要帶有頂部切換VC初始化方法中,重寫設(shè)置切換VC以及其屬性煤篙。
這樣就很簡單的實現(xiàn)了頂部切換效果了斟览。。
2.傳值問題
假如你的切換childVC創(chuàng)建的時候辑奈,需要傳值過去苛茂,就要用到keys和values屬性。
注意:keys必須是是你childVC的屬性名身害,values對應(yīng)要傳的值味悄,必須一一對應(yīng),且keys數(shù)量必須與childVC的數(shù)量一致 這時候你說塌鸯,要是我某一個VC需要多個傳值怎么辦侍瑟? 解決辦法:將多個傳值組合成一個model或是字典進(jìn)行傳值
當(dāng)某一個VC需要傳多個參數(shù)的時候,(這時候選擇使用DataSource代理的形式集成是非常不錯的選擇),我這里用的是init方法集成:
上面這種方法涨颜,當(dāng)你是后期集成這個庫到你的項目中费韭,可能會有點局限性。
集成tabVC的時候庭瑰,需要傳多個參數(shù)值星持,但是在其他地方跳轉(zhuǎn)過來的時候,可能只需要一個參數(shù)弹灭。這時候你在集成的時候?qū)⒍鄠€參數(shù)封裝成一個字典督暂,其他所有跳轉(zhuǎn)這個VC的地方都要將傳參改成字典形式,很麻煩穷吮。