美文网首页项目经验ios开发iOS
十分钟搭建App主流框架_纯代码搭建(OC)

十分钟搭建App主流框架_纯代码搭建(OC)

作者: Developer_Yancy | 来源:发表于2015-09-04 18:23 被阅读28588次

    搭建主流框架界面

    • 源码地址在文章末尾
    • 达成效果


      效果图
      • 注:本文部分图标及效果图来自[IT江湖] https://github.com/itjhDev/itjh

    导读

    • 我们玩iPhone应用的时候,有没发现大部分的应用都是上图差不多的结构,下面的TabBar控制器可以切换子控制器,上面又有Navigation导航条
    • 我们本文主要是讨论主体框架的搭建,数据暂时没有添加

    分析做项目的基本流程

    • 1.搭建项目主框架
      • (1)先搭建tabBarController(下面有一条)
      • (2)再搭建NavigationController(上面有一条,并且每个子控制器的不一样)
    • 2.思考开发方式
      • (1)storyboard搭建(界面很少的时候使用)
      • (2)纯代码搭建(界面超过5个的时候使用,易于管理,商业项目中,一般都使用这种方式)

    从0开始搭建主流框架(纯代码)

    1.准备工作

    • 环境部署
    Snip20150904_11.png

    2.初步搭建基本界面

    • 第一步 设计目录(根据模块化+MVC思想,创建基本文件目录与文件)
      • 模块化思想创建目录路径(一般先在真实路径下创建,再拖到项目中)
      • 自定义TabBarController
    Snip20150904_4.png
    • 第二步 上代码(在AppDelegate.m内设置窗口启动根控制器)
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        // 1.创建窗口
        self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
    
        // 2.设置窗口的根控制器
        CYXTabBarController *tabBarVC = [[CYXTabBarController alloc]init];
        self.window.rootViewController = tabBarVC;
    
        // 3.显示窗口
        [self.window makeKeyAndVisible];
    
        return YES;
    }
    
    • 第三步,在CYXTabBarController.m内创建并添加子控制器
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // 1.添加第一个控制器
        // 1.1 初始化
        CYXOneViewController *oneVC = [[CYXOneViewController alloc]init];
    
        // 1.2 把oneVC添加为UINavigationController的根控制器
        UINavigationController *nav1 = [[UINavigationController alloc]initWithRootViewController:oneVC];
    
        // 设置tabBar的标题
        nav1.title = @"首页";
        [nav1.navigationBar setBackgroundImage:[UIImage imageNamed:@"commentary_num_bg"] forBarMetrics:UIBarMetricsDefault];
    
        // 设置tabBar的图标
        nav1.tabBarItem.image = [UIImage imageNamed:@"tab_home_icon"];
    
        // 设置navigationBar的标题
        oneVC.navigationItem.title = @"首页";
    
        // 设置背景色(这些操作可以交给每个单独子控制器去做)
        oneVC.view.backgroundColor = [UIColor whiteColor];
    
        // 1.3 把UINavigationController交给UITabBarController管理
        [self addChildViewController:nav1];
    
        // 2.添加第2个控制器
        CYXTwoViewController *twoVC = [[CYXTwoViewController alloc]init];
        UINavigationController *nav2 = [[UINavigationController alloc]initWithRootViewController:twoVC];
        nav2.title = @"技术";
        nav2.tabBarItem.image = [UIImage imageNamed:@"js"];
        twoVC.navigationItem.title = @"技术";
        twoVC.view.backgroundColor = [UIColor blueColor];
        [self addChildViewController:nav2];
    
        // 3.添加第3个控制器
        CYXThreeViewController *threeVC = [[CYXThreeViewController alloc]init];
        UINavigationController *nav3 = [[UINavigationController alloc]initWithRootViewController:threeVC];
        nav3.title = @"博文";
        nav3.tabBarItem.image = [UIImage imageNamed:@"qw"];
        threeVC.navigationItem.title = @"博文";
        threeVC.view.backgroundColor = [UIColor yellowColor];
        [self addChildViewController:nav3];
    
        // 4.添加第4个控制器
        CYXFourViewController *fourVC = [[CYXFourViewController alloc]init];
        UINavigationController *nav4 = [[UINavigationController alloc]initWithRootViewController:fourVC];
        nav4.title = @"我的江湖";
        nav4.tabBarItem.image = [UIImage imageNamed:@"user"];
        fourVC.navigationItem.title = @"我的江湖";
        fourVC.view.backgroundColor = [UIColor grayColor];
        [self addChildViewController:nav4];
    
    }
    
    • 进行到这里,我们已经把框架搭起来了,是不是很简单?效果如图:
    Snip20150904_8.png
    • 但你可能会忍不住吐槽了,这些全是冗余的垃圾代码,没有可读性,下面就来抽取一下代码吧

    • 第四步,抽取重复代码

      • 由于上文的所有代码都写在viewDidLoad里面且重复代码过多,造成代码冗余,可扩展性不高的问题,下面让我们来对代码进行初步优化。
      • 这里提取两个方法,一个是添加所有子控制器的方法,另一个是添加每一个子控制器的方法
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self setUpAllChildViewController];
    }
    
    /**
     *  添加所有子控制器方法
     */
    - (void)setUpAllChildViewController{
        // 1.添加第一个控制器
        CYXOneViewController *oneVC = [[CYXOneViewController alloc]init];
        [self setUpOneChildViewController:oneVC image:[UIImage imageNamed:@"tab_home_icon"] title:@"首页"];
    
        // 2.添加第2个控制器
        CYXTwoViewController *twoVC = [[CYXTwoViewController alloc]init];
        [self setUpOneChildViewController:twoVC image:[UIImage imageNamed:@"js"] title:@"技术"];
    
        // 3.添加第3个控制器
        CYXThreeViewController *threeVC = [[CYXThreeViewController alloc]init];
        [self setUpOneChildViewController:threeVC image:[UIImage imageNamed:@"qw"] title:@"博文"];
    
        // 4.添加第4个控制器
        CYXFourViewController *fourVC = [[CYXFourViewController alloc]init];
        [self setUpOneChildViewController:fourVC image:[UIImage imageNamed:@"user"] title:@"我的江湖"];
    }
    
    
    /**
     *  添加一个子控制器的方法
     */
    - (void)setUpOneChildViewController:(UIViewController *)viewController image:(UIImage *)image title:(NSString *)title{
    
        UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:viewController];
        navC.title = title;
        navC.tabBarItem.image = image;
        [navC.navigationBar setBackgroundImage:[UIImage imageNamed:@"commentary_num_bg"] forBarMetrics:UIBarMetricsDefault];
    
        viewController.navigationItem.title = title;
    
        [self addChildViewController:navC];
    }
    

    相关文章

      网友评论

      • 臭码农:最近也搭了个框架,一起交流一下吧
        附上地址:http://www.jianshu.com/p/d553096914ff
      • 87e912b47ff4:请问一下作者 你这个方式创建出来的tabbar图片选中的颜色是蓝色,怎么修改?
        87e912b47ff4:@Coder_CYX 谢谢 我已经弄出来了
        Developer_Yancy:@lanhao 我这个是直接设置图片为默认不渲染(Original Image),或者你也可以使用代码设置
      • objcat:不错哦
      • Orient_ZY:博主是不是在CYXViewController.m里多写了个tabBarVc?还是说另有用处?
      • ae15c68cb7b8:为什么我用你上面那种方式设置不能显示,但是我用你下面哪种方式设置不能显示?
      • ae15c68cb7b8:你好,我按照你的流程搭建了框架,可是为什么效果和你不一样?我的导航栏没有显示,我的tab栏上吗的图片也没有出来?
        ae15c68cb7b8:@zhb书呆子 可以了,我把那里面的方法都试了一下,找到设置颜色的方法了
        ae15c68cb7b8:@zhb书呆子 我下载了你的源码对比了一下,现在问题解决了,但是我还有个问题,一直没找到设置导航控制器背景色的地方?请问一下你是在哪里设置的导航控制器背景色
        Developer_Yancy:@zhb书呆子 你好,可以下载我的源码对比一下哈
      • minjing_lin:挺好的,收藏
      • 杂食:这个骨架好。
      • 光明程辉:哈哈!自从用了storyboard后,就不想写代码了!!! :smile:
      • SKTT1Keyoubi:博主,问个问题,就是用xib自定义cell,往里面拖了控件进去,问题是怎么固定死这个控件的位置和大小,比如我往里面添加了imageView和label,在模拟器中看的话,imageView设置一张比较大的图片,最后显示出来就是把xib上那个大小的imageView给撑大了,我估计是在xib中的限制中弄,但是不知怎么弄,博主可知道?另外xib很不熟悉,有没有系统性的介绍xib用法的东西?刚自学不久~
        Developer_Yancy:@SKTT1Keyoubi 迟点可能会总结下,欢迎关注我的简书
        Developer_Yancy:设置cell的高度就好了,可以通过代码设或通过xib的属性
      • 清早八神:在我看了UI基础后不知道该干啥的时候,你这个帮我入了门。。。模仿写了个https://github.com/GallenY/GGS
      • 849f6117166a:ld: library not found for -lAFNetworking
        clang: error: linker command failed with exit code 1 (use -v to see invocation)
        Orient_ZY:@angellrp 打开xcworkspace
        Developer_Yancy:@angellrp 可能是AFN框架的问题,你试下重新装一下AFN吧
      • 小巷深深:你好,我看了你的文章,有点疑惑。麻烦看一下
        http://www.cocoachina.com/bbs/read.php?tid-329514.html
        小巷深深:@iOS_CYX 目前我的做法还能满足项目需求。所以暂时不动了。困扰了好久的问题终于明白了 多谢
        Developer_Yancy:@小巷深深 源码在Github上哈,可以下来看看,欢迎点个星星哈
        Developer_Yancy:@小巷深深 已回答。您好,你这种方式是相当于创建了一个共用的NavigationController,即四个tabBarController管理的子控制器都在用同一个NavigationController。但是实际需求中很多都是每一个tabBarController所管理的子控制器都需要一个自己NavigationController(因为navigationItem.title,navigationItem.leftBarButtonItem这些属性是各不相同的),应该分开管理。
      • 彭挺:https://github.com/CYXiang/CYXTenMinDemo.git

        这个演示, 为什么我这里技术 根博文都不显示呢?
        Developer_Yancy:@彭挺 点Readme了吗?欢迎★star,哈哈
      • 同学:代码还是有点冗余.建议2个数组,一个存控制器类名字符串,一个存title.然后遍历数组用NSStringFromClass生成控制器,再添加.
      • Developer_Yancy: @选一个昵称也被使用了 好眼力
        选一个昵称也被使用了:@iOS_CYX 哈哈,也是你的吗,还是copy 的
      • 选一个昵称也被使用了:貌似在cocoaChina看到过啊。。。。
      • 77500e8a7808:有没有代码
        Developer_Yancy:@andy521zhufuli 所有关键都贴出了哈,一步一步就可以做出来了
      • HenryPeng:不咋地!这种界面直接用Storyboard最快
        Developer_Yancy:@vic虎 看个人喜好哈,没有最好
      • 430ebae28078:github!!!
      • ef890ab28a15:正在学习
      • 1c89be27d843:其实 创建一个TabBarController 的category 是最佳解决方案
        1c89be27d843:@iOS_CYX

        - (UIViewController *)addViewController:(Class)viewController
        title:(NSString *)title
        image:(NSString *)image
        hightLight:(NSString *)hightLight
        {

        UIViewController *vc = [[viewController alloc] init];
        vc.title = title;

        BaseNavigationViewController *nc = [[BaseNavigationViewController alloc] initWithRootViewController:vc];

        vc.hidesBottomBarWhenPushed = NO;
        nc.delegate = (id<UINavigationControllerDelegate>)vc;

        UIImage *commonImage = nil;
        UIImage *hightlightImage = nil;

        if (image) {
        commonImage = [UIImage imageNamed:image];
        }
        if (hightLight) {
        hightlightImage = [UIImage imageNamed:hightLight];
        }

        UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:nc.title
        image:commonImage
        selectedImage:hightlightImage];
        nc.tabBarItem = item;



        NSMutableArray *muArry = [[NSMutableArray alloc] initWithArray:self.viewControllers];
        [muArry addObject:nc];
        self.viewControllers = muArry;

        return vc;
        }
        Developer_Yancy:@vfanx 我没太懂你的意思..?
      • 小木___Boy:思路明确,但过于简陋,初学者可以看看
      • lbfly_boy:不咋地
        johnzz:@会飞_boy 为啥这么说呢,你能否给个好一点的demo呢参考下 :grin:
      • __Null:我个人更倾向于:window的rootcontroller是个navigationcontroller,导航控制器的rootcontroller是个tabbarcontroller,然后tabbarcontroller的view controllers直接是一般的视图控制器。
        小巷深深:我现在的结构和你的一样 但是现在遇到一个bug,不知道是不是因为这个结构导致的 http://www.cocoachina.com/bbs/read.php?tid=1715657
        __Null:@特拉法尔咖 是的 你可以看一下我写的《iOSApp导航层级的设计》。
        特拉法尔咖:@iOSWH__ 导航控制的导航栏内容由栈顶控制器决定,这样的结构设置会造成整个项目只有一个导航栏吧?
      • Developer_Yancy: @d85e41740416 哈哈,且用且珍惜吧。我还是觉得总体框架用纯代码,个别静态页面用sb协同开发好点,当然没有我这篇文章说的这么简单
      • Yutaolin:其实一个模块一个sb就挺OK的,既快又有利于合作开发。
      • Mehere:demo
      • fewerworld:简书里难得一见的技术文…膜拜同行……
        Developer_Yancy:@fewerworld 过奖啦,互相学习
      • iHTCboy:这是思路正确,但真正开发中,有几个问题1、导航控制器要用系统自带?由于现在导航栏有隐藏渐变,各种动画,也牵扯到手势返回等,有什么好的第三方?2,tabbar 现在也经常变图标,像京东一个活动换一次,如果自定义的时候,怎么控制几个控制器等,开发中如何选择?3,还是基类中,应该集成注册登录,全局参数等,这些问题我一直没有找到人讨论,望就指教!
        Developer_Yancy:@HTC一切都是根据需求而定的。1.导航控制器你可以自定义,只需要自定义一个和系统TabBar等宽等高的View加到系统的TabBar上,并移除系统自带的TabBar里面的子控件,在自定义的TabBar里面添加按钮,设置selectedIndex就可以切换控制器。Navigation导航栏的隐藏渐变效果可以通过设置Alpha值实现,手势返回的意思是全屏返回?由于篇幅有限,牵扯到的细节很多,不是几句话可以说得明白。2.同上。3.我没太懂你这个问题
      • 一一无痕:谢谢分享
      • 9cd0c38b11f9:思路很清晰,值得学习
      • 7622d9c40b72:正在学习ios,前辈有没有建议的流程
        7622d9c40b72:@iOS_CYX 谢谢你的回答!初学者也是先学习UI吗?有没有推荐的视频或者书籍,我现在有很多资料,却无从下手
        Developer_Yancy:@Pongroc 流程?应该是先UI,再网络吧,具备这两个就可以做项目了。再学一些iOS高级,例如动画,多线程等,多看第三方框架和别人源码。
      • 庞大不小: :smile: 文章写得很不错。 还是纯代码提高效率。
        Developer_Yancy:@九夕 哈哈,可以,还算比较简单的
        庞大不小:@iOS_CYX 我的江湖 这个项目开源的,是用swift写的。 :smirk: 你可以讲他慢慢翻译为OC的。
        Developer_Yancy:@九夕谢谢 互相学习
      • 哈仕啦:现在xcode7出了storyboard reference 用sb管理很方便了
        Developer_Yancy:@哈仕啦 呵呵新东西先学吧,可能是个趋势,也可能出来以后没人用,新的项目可以试下,但旧的项目应该是没什么可能让你改了
      • 6583f8b9eaf8:= =感觉直接故事版会更快
        ebay_Happy:故事版是快,但是如果团队开发的话 很难管理,纯代码的话会好点
        emptyqian:@iOS_CYX 我们真实的项目,storyboard + nib 开发,并不需要特别多得连线,掌握了之后,并不是传说中得name难管理。
        Developer_Yancy:@lk920724 这里只是简单的几个界面,肯定StoryBoard快,但如果项目的界面多起来你再用StoryBoard就会很难管理,一页全是页面还有连线看着眼都花了~哈哈。顺便提醒一句,真实的项目开发中几乎全是纯代码的,等你工作了慢慢就会体会到了

      本文标题:十分钟搭建App主流框架_纯代码搭建(OC)

      本文链接:https://www.haomeiwen.com/subject/vzilcttx.html