频道栏目
首页 > 程序开发 > 移动开发 > 其他 > 正文
自定义按钮实现标签栏切换
2017-07-20 09:38:57         来源:黄飞的博客专栏  
收藏   我要投稿

最近由于快速开发的需要,换了一下口味,由之前的纯代码布局转向 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: 父视图控制器],因为已经默认调用了。

点击复制链接 与好友分享!回本站首页
上一篇:React-Native子组件修改父组件的几种方式,兄弟组件状态修改
下一篇:AbstractQueuedSynchronizer(AQS)源码解析
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站