记录一下写一个ipad上第一次使用splitViewController的过程,
1。使用storyBoard,将storyBoard中的View 删掉,拖入一个splitVC,将程序的入口指向split ,同时,将AppDelegate中的window的rootVC 设为splitVC
2.新建两个VC,分别是master(LeftMenuTableViewController) 和detail(DetailViewController) ,不需要xib,
@interface LeftMenuTableViewController : UITableViewController
@end
@interface DetailViewController : UIViewController
@property (nonatomic,strong)UIBarButtonItem *splitViewBarButtonItem;
@property (nonatomic,strong)UIPopoverController *iMasterPopOver;
- (void)setSplitViewBarButtonItem:(UIBarButtonItem *)barButtonItem;
@end
@implementation DetailViewController
- (void)setSplitViewBarButtonItem:(UIBarButtonItem *)barButtonItem{
if (_splitViewBarButtonItem)
self.navigationItem.leftBarButtonItems = nil;
if (barButtonItem)
self.navigationItem.leftBarButtonItem = barButtonItem;
_splitViewBarButtonItem = barButtonItem;
}
@end
然后在storyBoard中将split 的master 和detail两个VC的class改成相应的新建的管理类。同时,左侧master应该作为split的delegate(注意:应在storyBoard中连接,否则程序最开始为竖屏时,不会显示BarButtonItem)
splitVC的Delegate 方法是用来实现横竖屏master 显示/隐藏
- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc{
barButtonItem.title = Locale(@"Menu"); // use a better word than “Master”!
UINavigationController *rightVC = (UINavigationController*)[svc.viewControllers lastObject];
DetailViewController *vc = (DetailViewController*)[rightVC.viewControllers objectAtIndex:0];
vc.splitViewBarButtonItem = barButtonItem;
vc.iMasterPopOver = pc;
}
- (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem{
UINavigationController *rightVC = (UINavigationController*)[svc.viewControllers lastObject];
DetailViewController *vc = (DetailViewController*)[rightVC.viewControllers objectAtIndex:0];
vc.splitViewBarButtonItem = nil;
vc.iMasterPopOver = nil;
}
- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation{
return UIInterfaceOrientationIsPortrait(orientation);
}
3.设置splitVC的左右两个VC时,需同时设置
UISplitViewController *rootVC = (UISplitViewController*)self.window.rootViewController;
UIViewController *vc = [[UIViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
NSArray *vcarr = [NSArray arrayWithObjects:[rootVC.viewControllers objectAtIndex:0],nav, nil];
rootVC.viewControllers = vcarr;
4.在切换右侧时,由于重新init,所以会没有BarButtonItem,所以
1)DetailVC是右侧的一个父类,有splitBarButtonItem属性,也同时实现 splitDelegate 在显示/隐藏 master时来显示/隐藏 BarButtonItem
2)在切换VC时,把当前右侧的BarButtonItem取出来给新的VC
3)viewDidLoad时,重新调用setBarButtonItem方法
4)父类重新设置BarButton
a:先把之前的nil(toolBar上)
b:抚给新的BarButtonItem(放在toolBar上)
c:赋给属性
点击左侧tableCell ,切换右侧的代码
AppDelegate *delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
UISplitViewController *rootVC = (UISplitViewController*)delegate.window.rootViewController;
UINavigationController *rightNav = (UINavigationController*)[rootVC.viewControllers lastObject];
DetailViewController *right =(DetailViewController*)[rightNav.viewControllers objectAtIndex:0];
if (right.iMasterPopOver) {
[right.iMasterPopOver dismissPopoverAnimated:YES];
}
if (self.iSelectIndexPath.row == indexPath.row && self.iSelectIndexPath.section == indexPath.section) {
return;
}
UITableViewCell *cellBefore = [tableView cellForRowAtIndexPath:self.iSelectIndexPath];
cellBefore.backgroundColor = [UIColor clearColor];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.backgroundColor = [UIColor lightGrayColor];
self.iSelectIndexPath = indexPath;
UINavigationController *leftnav =[rootVC.viewControllers objectAtIndex:0];
UIViewController *vc = [[UIViewController alloc] init];
if (right.splitViewBarButtonItem) {
vc.splitViewBarButtonItem = right.splitViewBarButtonItem;
vc.iMasterPopOver = right.iMasterPopOver;
}
rightNav = [[UINavigationController alloc] initWithRootViewController:vc];
NSArray *vcarr = [NSArray arrayWithObjects:leftnav,rightNav, nil];
rootVC.viewControllers = vcarr;
UIViewController 是DetailViewController的子类
5.想点击左侧切换右边并且隐藏左边,需给右边一个pc(是从delegate方法传过去的,这个值会在右边一直保持,点击左边时,第四missPopover)(不能给左边,因为左边不是一直存在,原因暂时还没清楚)