iPad開發(fā)之自定義實現(xiàn)分屏控制器的功能

前言

最近公司需要開發(fā)iPad版的應(yīng)用程序,項目中要實現(xiàn)分屏控制器的功能,之前有了解到使用UISplitViewController可以實現(xiàn)分屏的功能,當(dāng)時查了查資料,感覺挺簡單的,但是隨著研究的深入,發(fā)現(xiàn)并不是那么容易的,由于網(wǎng)上關(guān)于UISplitViewController的使用教程并不多,自定義實現(xiàn)分屏功能的教程就更少了,所以接下來我將把這幾天對UISplitViewController的研究和自定義實現(xiàn)分屏控制器的功能的Demo分享給大家,希望能幫助到有這方面困惑的朋友。

使用系統(tǒng)的UISplitViewController

Demo中的第一個target是使用的UISplitViewController,通過storyboard實現(xiàn),系統(tǒng)的UISplitViewController挺簡單的,實現(xiàn)步驟:

  1. 在storyboard中添加一個UISplitViewController控制器,給DetailViewController包裝一個導(dǎo)航控制器,這里在連線的時候要注意,要和splitViewController建立關(guān)系,選擇detail view controller。
Paste_Image.png

2.新建一個控制器MainViewController繼承自UISplitViewController,MasterTableViewController繼承自UITableViewController,DetailViewController繼承自UIViewController,并把相關(guān)控制器和storyboard中的相關(guān)聯(lián)益眉。

3.在MasterTableViewController中編寫一個協(xié)議,主要思路就是MainViewController成為MasterTableViewController的代理,實現(xiàn)協(xié)議方法,從而和DetailViewController交互雹熬。

@protocol masterTableViewControllerDelegate <NSObject>

- (void)masterTableViewController:(MasterTableViewController *)masterVC didSelectedRow:(SingleModel *)singleModel;

@end

在MasterTableViewController中的tableView行點擊事件中,調(diào)用代理方法,傳遞數(shù)據(jù)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    if ([self.delegate respondsToSelector:@selector(masterTableViewController:didSelectedRow:)]) {    
        GroupModel *groupModel = self.groupModel[indexPath.section];
        [self.delegate masterTableViewController:self didSelectedRow:groupModel.typeList[indexPath.row]];
    }
}

在MainViewController中,設(shè)置當(dāng)前控制器為MasterTableViewController的代理,實現(xiàn)協(xié)議方法

- (void)viewDidLoad {
    [super viewDidLoad];

    //獲取到導(dǎo)航控制器對象
    UINavigationController *masterNav = [self.childViewControllers firstObject];
    
    //獲取到MasterTableViewController的對象
    MasterTableViewController *master = [masterNav.childViewControllers firstObject];
    
    master.delegate = self;
}
/**
 *  masterTableViewController的代理方法
 */
- (void)masterTableViewController:(MasterTableViewController *)masterVC didSelectedRow:(SingleModel *)singleModel{
    
    UINavigationController *detailNav = [self.childViewControllers lastObject];
    DetailViewController *detail = [detailNav.childViewControllers firstObject];
    
    detail.singleModel = singleModel;
    
    [detailNav popToRootViewControllerAnimated:YES];
}

重寫DetailViewController的屬性singleModel的setter方法就能實現(xiàn)和MasterTableViewController交互了

- (void)setSingleModel:(SingleModel *)singleModel{
    
    _singleModel = singleModel;
    
    self.nameView.text = singleModel.subjectName;
}

通常情況下,詳情界面也會是一個tableView,在重寫的singleModel中獲取到上一界面?zhèn)鱽淼闹?讓當(dāng)前控制器的tableView reloadData就可以了碳抄。

自定義實現(xiàn)分屏的功能

這個是今天要介紹的重點,因為有的時候系統(tǒng)的UISplitViewController并不能滿足項目的需求,UISplitViewController只能做為程序窗口的根視圖,當(dāng)程序中需要使用UITabBarController或者UINavigationController來切換到分屏控制器的時候,并不能到達(dá)我們的目的是牢。
可以看一下官網(wǎng)對UISplitViewController的介紹

主要的一個截圖

Paste_Image.png

大體的意思就是分屏控制器不能進(jìn)入導(dǎo)航的棧中(也就是不能通過導(dǎo)航控制器跳轉(zhuǎn)),不推薦將分屏控制器做為某個控制器的子控制器,通常是做為程序窗口的根視圖痴荐。

那如果需求是: 在主界面需要跳轉(zhuǎn)到分屏控制器改怎么辦呢烘豌?

這里有一種思路就是在主界面放一個按鈕,在按鈕的點擊方法里面切換window的根視圖。這個不是今天介紹的重點,就不在這里討論了辙纬。

重點是---怎么自定義控制器具有分屏顯示的功能(結(jié)合UITabBarController)

思路是新建三個控制器,分別是主控制器豁遭、左側(cè)顯示的列表控制器和右側(cè)顯示的詳情控制器,將列表控制器和詳情控制器的View添加到主控制器的View上,讓主控制器成為列表控制器的代理,實現(xiàn)相應(yīng)的協(xié)議方法從而和詳情控制器就行交互。大體的思路和上面提到的使用系統(tǒng)的UISplitViewController差不多贺拣,主要的不同就是沒有使用UISplitViewController,而是自定義的UIViewController,主要看一下自定義控制器中的代碼蓖谢。

添加兩個導(dǎo)航控制器的屬性

@property (nonatomic, strong) UINavigationController *masterNav;
@property (nonatomic, strong) UINavigationController *detailNav;

在viewDidLoad中初始化列表控制器和詳情控制器,并添加到主控制界面上捂蕴。

- (void)viewDidLoad {
    [super viewDidLoad];

   // self.navigationController.navigationBarHidden = YES;
    
    HZYMasterViewController *masterVC = [HZYMasterViewController new];
    self.masterNav = [[UINavigationController alloc] initWithRootViewController:masterVC];
    [self addChildViewController:self.masterNav];
    [self.view addSubview:self.masterNav.view];
    
    HZYDetailViewController *detailVC = [HZYDetailViewController new];
    self.detailNav = [[UINavigationController alloc] initWithRootViewController:detailVC];
    [self addChildViewController:self.detailNav];
    [self.view addSubview:self.detailNav.view];
    
    masterVC.delegate = self;
}

實現(xiàn)協(xié)議方法

- (void)masterViewController:(HZYMasterViewController *)masterVC didSelectedRowInSection:(NSInteger)section{
    
    HZYDetailViewController *detailVC = [self.detailNav.childViewControllers firstObject];
    
    [self.detailNav popToRootViewControllerAnimated:YES];
    
    //向detailVC傳遞點擊的Section用來區(qū)分detailVC中tableViewCell的顯示樣式
    [detailVC putSection:section];
}

核心的方法,當(dāng)控制器的View的子視圖重新布局時調(diào)用,用來布局子視圖。

- (void)viewWillLayoutSubviews{
        [_masterNav.view mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(@64);
            make.left.equalTo(@70);
            make.width.equalTo(kMasterWidth);
            make.bottom.equalTo(@0);
        }];
        
        [_detailNav.view mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.top.bottom.equalTo(_masterNav.view);
            make.right.equalTo(self.view.mas_right);
            make.left.equalTo(_masterNav.view.mas_right);
        }];
}

DetailViewController在putSection方法的實現(xiàn)中獲得index,工具類通過index獲得相應(yīng)模型數(shù)據(jù),刷新tableView

- (void)putSection:(NSInteger)section{
    
    _section = section;
    
    __weak typeof (self) weakSelf = self;
    
    //獲取點擊Section的模型數(shù)據(jù)闪幽,為了方便這里每個Section中的行都是一個模型數(shù)據(jù)啥辨,如果獲取網(wǎng)絡(luò)數(shù)據(jù)的話要更改工具類中的方法,視情況而定盯腌!
    [Tool getDataWithSection:section successBlock:^(NSMutableArray *modelArray) {
        
        weakSelf.modelArray = modelArray;
        
        [weakSelf.tableView reloadData];
    }];
}
Demo介紹

Demo分為兩個target,一個是通過系統(tǒng)UISplitViewController結(jié)合storyboard實現(xiàn)的,一個是自定義控制器純代碼實現(xiàn)的溉知。

Paste_Image.png
工程中添加兩個target的遇到的坑

之前并沒有在一個工程中添加過兩個target,這次在兩個target下coding遇到最多的問題就是

Paste_Image.png

一般這種問題就是編譯的問題,找不到編譯的源文件,解決方法就是在工程的target->Build Phases->Compile Sources,添加報錯的.m文件,重新編譯就OK了!
為什么會產(chǎn)生這種錯誤呢腕够?主要就是在新建類的時候沒有選中相應(yīng)的target

Paste_Image.png

還有一種解決方案级乍,選中報錯的.m文件,展開實用工具(配合IB實用的那個欄目),點擊第一個(file inspector),找到下面的Target Membership,勾選上相應(yīng)的target。

Paste_Image.png
結(jié)語:

第一次在簡書上面發(fā)表文章,希望我這幾天的研究能夠幫助到有這方面困惑的朋友,謝謝大家的支持帚湘。

最近很欣賞薛之謙說的一句話:在這個時代根本就沒有懷才不遇玫荣, 關(guān)鍵是你真的必須具備才華 所以請你一定要強(qiáng)大自己!對于我們iOS開發(fā)來說大诸,市場已經(jīng)進(jìn)入飽和期了(甚至有人調(diào)侃為iOS爛大街)捅厂,很多人抱怨工作不好找,現(xiàn)在的市場需要的不再是只會寫寫界面底挫,只會上網(wǎng)復(fù)制粘貼代碼的開發(fā)者恒傻,所以你一定要強(qiáng)大自己脸侥,等你足夠強(qiáng)大了建邓,好的工作自然就來了!

最后獻(xiàn)上我的Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睁枕,一起剝皮案震驚了整個濱河市官边,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌外遇,老刑警劉巖注簿,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異跳仿,居然都是意外死亡诡渴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門菲语,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妄辩,“玉大人,你說我怎么就攤上這事山上⊙垡” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵佩憾,是天一觀的道長哮伟。 經(jīng)常有香客問我干花,道長,這世上最難降的妖魔是什么楞黄? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任池凄,我火速辦了婚禮,結(jié)果婚禮上鬼廓,老公的妹妹穿的比我還像新娘修赞。我一直安慰自己,他們只是感情好桑阶,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布柏副。 她就那樣靜靜地躺著,像睡著了一般蚣录。 火紅的嫁衣襯著肌膚如雪割择。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天萎河,我揣著相機(jī)與錄音荔泳,去河邊找鬼。 笑死虐杯,一個胖子當(dāng)著我的面吹牛玛歌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播擎椰,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼支子,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了达舒?” 一聲冷哼從身側(cè)響起值朋,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巩搏,沒想到半個月后昨登,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡贯底,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年丰辣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禽捆。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡笙什,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睦擂,到底是詐尸還是另有隱情得湘,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布顿仇,位于F島的核電站淘正,受9級特大地震影響摆马,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸿吆,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一囤采、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惩淳,春花似錦蕉毯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至激蹲,卻和暖如春棉磨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背学辱。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工乘瓤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人策泣。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓衙傀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親萨咕。 傳聞我的和親對象是個殘疾皇子统抬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

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

  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實...
    香橙柚子閱讀 23,918評論 8 183
  • 最近在做團(tuán)隊項目,在開發(fā)中不可避免的會用到一些第三方類庫任洞,它們提供了很多實用的功能蓄喇,使我們的開發(fā)變得更有效率发侵;同時...
    豆汁兒還是豆花兒閱讀 4,420評論 0 10
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,312評論 25 707
  • 本來你們可以在一起做更多的事交掏,而不用浪費彼此的時間和精力在要與不要之間徘徊,本來你們可以去更多的地方刃鳄,一起進(jìn)步盅弛。本...
    昨夜西風(fēng)凋碧樹閱讀 291評論 0 1
  • 在現(xiàn)實世界中挪鹏,參與者可以從合作中獲益更多,但最終重新開始相互競爭的情況卻更多愉烙。這種現(xiàn)象一般是由這樣幾個原...
    小小杠桿閱讀 553評論 0 2