最近由于快速开发的需要,换了一下口味,由之前的纯代码布局转向 StoryBoard 布局。在开发小型 IOS APP 时还是事半功倍的。本文先简要说说根据 StoryBoard 获取独立的 UIViewController 的几个步骤,以及自定义按钮实现底部标签栏切换。
1. 获取Storyboard中单独的控制器
有三种方式:
1> + (UIStoryboard *)storyboardWithName:(NSString *)name bundle:(NSBundle *)storyboardBundleOrNil
上面的方法表示通过 storyboard 的名字从某个包中获取(一般设置为nil表示从主包中获取)storyboard;
2>- (id)instantiateInitialViewController
此方法获取到storyboard中初始的控制器;
3>- (id)instantiateViewControllerWithIdentifier:(NSString *)identifier;
此方法表示通过控制器的identifier获取到此控制器,Storyboard ID来表示某个控制器的identifier;
2. 在 storyboard 中设置单独的 UIViewController 的 identifier,即 Storyboard ID,用于区分 storyboard 中的控制器。
3. 在类中调用 storyboard 中的-instantiateViewControllerWithIdentifier: 方法获取出单独的VC
AViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:
NSStringFromClass([MainViewController class])]
4. push或modal出vc即可
[self.navigationController pushViewController:vc animated:YES];
自定义按钮实现标签栏切换
- (void)replaceContent:(UIViewController *)replaceCtrl {
if ([self.childViewControllers count] > 0) {
UIViewController *oldCtrl = [self.childViewControllers objectAtIndex:0];
[oldCtrl willMoveToParentViewController:nil];
[oldCtrl removeFromParentViewController];
}
for (UIView *tempView in [self.contentView subviews]) {
[tempView removeFromSuperview];
}
[self addChildViewController:replaceCtrl];
replaceCtrl.view.frame = CGRectMake(0, 0, self.contentView.frame.size.width, self.contentView.frame.size.height);
[self.contentView addSubview:replaceCtrl.view];
[replaceCtrl didMoveToParentViewController:self];
}
结合前面所述,先根据 StoryBoard 获取独立的 UIViewController,然后将此 UIViewController 加到当前控制器上:
SetViewController *setCtrl = [[self storyboard] instantiateViewControllerWithIdentifier:
NSStringFromClass([SetViewController class])];
[self replaceContent:setCtrl];
注意点:
在调用 [父视图控制器 addChildViewController: 子视图控制器] 之前,无需显式调用 [子视图控制器 willMoveToParentViewController: 父视图控制器] 方法,因为已经默认调用了。
在调用 [父视图控制器 addChildViewController: 子视图控制器] 之后,要仅接着调用 [子视图控制器 didMoveToParentViewController: 父视图控制器] 方法。
在调用 [子视图控制器 removeFromParentViewController] 之前,必须先调用 [子视图控制器 willMoveToParentViewController:nil]。
在调用 [子视图控制器 removeFromParentViewController] 之后,无需显式调用 [子视图控制器 didMoveToParentViewController: 父视图控制器],因为已经默认调用了。