当前播放: 09 | 结合视图和控制器构建Tabbar样式页面
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程目录
第一章:课程简介和开发前的准备 (4讲)
01 | 课程介绍
免费
02 | 内容综述
免费
03 | 常见App类型及技术栈浅析
免费
04 | 使用Xcode创建第一个工程
免费
第二章:实现App的基本界面 (33讲)
05 | MVC模式:iOS中的架构基石
免费
06 | iOS中的视图UIView
免费
07 | 了解UIView的生命周期
08 | 视图的控制器UIViewController
09 | 结合视图和控制器构建Tabbar样式页面
10 | 使用Navigation构建App的基础交互
11 | iOS基本页面框架的构成和实现
12 | 系统函数中常见模式Delegate
13 | UITableView简介
14 | UITableView中Delegate和Datasource的使用
15 | UITableViewCell的复用及原理
16 | 结合子视图实现完整的列表界面
17 | UICollectionView的基本应用和实现
18 | UICollectionViewLayout的应用
19 | 基本列表视图的选择和使用
20 | 滚动视图的基类UIScrollView简介
21 | 应用UIScrollViewDelegate实现复杂逻辑
22 | iOS中滚动视图对比及App内应用场景浅析
23 | iOS中文字的展示:UILabel的使用与布局
24 | iOS中图片的展示:UIImage与UIImageView的应用
25 | iOS中按钮的实现:UIButton的使用
26 | UIControl以及Target-Action模式
27 | 使用UIGestureRecognizer实现自定义点击与手势
28 | 通过UIAlertView了解UIKit系统函数的设计和使用
29 | Web基础知识及WKWebView 介绍
30 | 使用WKWebView及Delgate实现简单的页面加载
31 | 认识观察者模式KVO并展示页面加载进度
32 | iOS开发中的Web应用浅析
33 | 使用UIView动画完善界面的交互
34 | 动画背后的CALayer基本应用
35 | CoreAnimation及开源动画框架介绍
36 | 常用代码规范和重构方式
37 | 结合UIKit分析常用App的页面结构
第三章:实现App的基础功能 (35讲)
38 | 网络基础及请求的封装
39 | NSURLSession基础原理、组织和使用
40 | 使用系统网络架构NSURLSession加载网络数据
41 | 常用框架集成方式Submodule、Carthage和CocoaPods对比和使用
42 | 集成和使用开源网络框架
43 | iOS中的JSON解析
44 | 使用结构化的数据进行解析和展示
45 | 实现列表数据加载、解析和展示的完整流程
46 | iOS沙盒机制和文件结构
47 | 使用NSFileManager操作和管理文件
48 | iOS中的序列化NSCoding
49 | 开源存储方案对比与分析
50 | 缓存新闻列表数据及已读状态
51 | iOS中线程的基础知识及NSThread
52 | GCD的常用方法分析和使用
53 | 了解Operation、Runloop以及多线程开发总结
54 | 如何管理App中的图片下载与存储
55 | 开源图片框架接触的架构和使用
56 | 了解iOS系统的音视频框架
57 | 重构视频列表展示视频
58 | 实现简单视频播放器AVPlayer
59 | iOS消息机制NSNotification简介
60 | 使用Notification接收和处理播放状态通知
61 | 使用KVO监听和处理播放资源的状态变化
62 | CMTime及播放缓冲进度的获取和使用
63 | 使用单例模式重构播放器业务逻辑
64 | 常用App视频业务及流程浅析
65 | AutoLayout简介
66 | 使用AutoLayout实现通用ToolBar视图
67 | iOS常用布局方式选择
68 | 逻辑分辨率适配
69 | 物理分辨率适配
70 | 使用ImageAsset管理图片资源
71 | iPhone X适配
72 | iOS开发适配常用方法总结
第四章:App功能扩展和完善 (34讲)
73 | App启动过程及生命周期分析
74 | 通过App生命周期回调实现启动页
75 | 使用URL Scheme进行App间的唤起和通信
76 | Universal Link简介
77 | 常用组件化Target-Action方案
78 | 常用组件化URL Scheme方案
79 | 常用组件化Protocol-Class方案
80 | 实现简单的第三方登录和分享功能
81 | iOS中静态库的制作和使用
82 | iOS当中Framework的制作和使用
83 | OAuth和OpenID原理和使用
84 | 集成QQ SDK实现登录和分享功能
85 | iOS中常用日志和上报系统浅析
86 | 类CocoaLumberjack日志框架架构浅析
87 | Crash的类型介绍和常用收集方案
88 | 常用上报技术方案对比和分析
89 | iOS中定位和定位权限
90 | 定位功能实现和位置信息的获取
91 | iOS中推送和推送权限
92 | 使用UserNotifications实现本地推送
93 | 远程推送与APNs简介
94 | 使用UserNotifications接收远程推送
95 | iOS图标管理和动态更新
96 | iOS App Extension简介
97 | 实现Today Extension以及数据共享
98 | UITextField和UITextView
99 | 使用UITextField实现搜索条
100 | 使用UITextView实现输入框
101 | 复杂列表页实现方案及IGListKit浅析
102 | 复杂内容页展示逻辑及实现方案浅析
103 | App的签名原理和证书申请
104 | 常用iOS唯一标识符
105 | App的打包和上架流程
106 | 结课测试&结束语
09 | 结合视图和控制器构建Tabbar样式页面

09 | 结合视图和控制器构建Tabbar样式页面

朱德权
腾讯高级工程师
全集2800
新人首单 ¥29.9 原价 ¥129
4
本节摘要
登录 后留言

精选留言(28)

  • Bojack
    iOS13里生命周期有所调整需要将代码移动到SceneDelegate.m中
    ```
        self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene];
        UITabBarController *tabbarController = [[UITabBarController alloc] init];

        UIViewController *controller1 = [[UIViewController alloc] init];
        controller1.view.backgroundColor = [UIColor redColor];
        controller1.tabBarItem.title = @"xinwen";

        UIViewController *controller2 = [[UIViewController alloc] init];
        controller2.view.backgroundColor = [UIColor greenColor];
        controller2.tabBarItem.title = @"keji";

        UIViewController *controller3 = [[UIViewController alloc] init];
        controller3.view.backgroundColor = [UIColor blueColor];
        controller3.tabBarItem.title = @"tuijian";

        UIViewController *controller4 = [[UIViewController alloc] init];
        controller4.view.backgroundColor = [UIColor yellowColor];
        controller4.tabBarItem.title = @"wode";

        [tabbarController setViewControllers:@[controller1, controller2, controller3, controller4]];

        self.window.rootViewController = tabbarController;
        [self.window makeKeyAndVisible];
    ```

    作者回复: 👍!

    2019-09-24
    4
    7
  • Geek_Maggie
    iOS13中appdelegate的职责发现了改变:
    iOS13之前,Appdelegate的职责全权处理App生命周期和UI生命周期;
    iOS13之后,Appdelegate的职责是:
    1、处理 App 生命周期
    2、新的 Scene Session 生命周期
    那UI的生命周期交给新增的Scene Delegate处理

    - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        UIWindowScene *windowScene = (UIWindowScene *)scene;
        self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
        self.window.frame = windowScene.coordinateSpace.bounds;
        
        UITabBarController *tabbarController = [[UITabBarController alloc] init];
        
        UIViewController *controller1 = [[UIViewController alloc] init];
        controller1.view.backgroundColor = [UIColor redColor];
        controller1.tabBarItem.title = @"新闻";
        
        UIViewController *controller2 = [[UIViewController alloc] init];
        controller2.view.backgroundColor = [UIColor yellowColor];
        controller2.tabBarItem.title = @"视频";
        
        UIViewController *controller3 = [[UIViewController alloc] init];
        controller3.view.backgroundColor = [UIColor blueColor];
        controller3.tabBarItem.title = @"推荐";
        
        UIViewController *controller4 = [[UIViewController alloc] init];
        controller4.view.backgroundColor = [UIColor greenColor];
        controller4.tabBarItem.title = @"我的";
        
        // 将四个页面的 UIViewController 加入到 UITabBarController 之中
        [tabbarController setViewControllers: @[controller1, controller2, controller3, controller4]];
        
        self.window.rootViewController = tabbarController;
        [self.window makeKeyAndVisible];
    }

    作者回复: 👍👍

    2020-02-17
    1
    4
  • sololo
    您好:
    按照视频 7 分 16 秒时的代码设置window :

    ```
    - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.window.rootViewController = [[UIViewController alloc] init];
        [self.window setBackgroundColor:[UIColor redColor]];
        [self.window makeKeyAndVisible];
        return YES;
    }
    ```
    运行程序出现以下错误:

    SimpleApp[37324:5421992] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate setWindow:]: unrecognized selector sent to instance 0x600003c580b0'

    请教是什么含义呢?该怎么解决?🤝

    作者回复: 应该是下载新的Xcode用的iOS13导致的。iOS13之后,appdelegate的指责发生了变化,具体的可以参考https://developer.apple.com/videos/play/wwdc2019/42 这个session。 简单的说和UI生命周期相关的回调都交给了SceneDelegate 这个delegate,而appdelegate主要负责 app 生命周期相关的回调。对于window来说,作为一个特殊的UI,也自然的变成了SceneDelegate的一个property,我们可以在SceneDelegate的头文件中找到它,并在willConnectToSession这个函数中使用。简单的说,我们讲视频中对应的代码移动到SceneDelegate.m中即可。

    2019-10-06
    2
    4
  • 一步
    老师 ,那么改完代码自动运行是怎么设置的啊? 不用在每次点击运行按钮了?

    作者回复: 快捷键 command + R

    2019-06-09
    4
  • eee-曲项向天歌
    7分20秒的跳转到UITabBarController,快捷操作是什么?一脸懵逼呀。

    作者回复: shift+command+o 这个是open quickly的快捷键,可以在里面输入类和函数,快速的进行跳转

    2019-04-18
    4
  • 小胖
    controller3.tabBarItem.title
    为什么每个UIViewController有 tabBarItem 这个属性,api的源文件里面并没有这个属性

    作者回复: 根据Apple的习惯,如果类的某一些属性,不是普世通用的,是在实现某些特定功能的时候才需要,那么一般的实现方式是声明一个类的扩展,然后声明这些属性,整体和特定的功能写在一起。这个也算是一个习惯,对于常用的开源项目和我们自定义的扩展,一般也都会和指定的场景声明在一起。回归到你的问题,如果我们没有tabbarcontroller,那么使用UIViewController是不需要关注tabBarItem属性的。那么根据上面所讲的,针对这种特殊的场景,一般就是对UIViewController进行扩展,然后写到tabbarcontroller相关的逻辑和文件中。所以我们可以在UITabbarController.h 中 找到@interface UIViewController (UITabBarControllerItem),以及对应的tabBarItem属性。当然如果想要定位这个属性在哪里声明,可以在xcode中按住command,然后点击这个属性,之后选择jump to Definition,xcode会自动跳转到属性声明的文件中。

    2020-03-10
    3
  • sololo
    Xcode 对代码格式化的 快捷键是什么呢?

    作者回复: 建议使用xcformat这个工具 具体的在重构那一节课有讲解哈 36节

    2019-09-27
    1
    2
  • wuwei
    tabbarItem这个属性是UITabBarController的属性,UIViewControlle是UITabBarController的父类,在调用时并不存在这个属性,为何不报错呢

    作者回复: tabbarItem虽然在UITabBarController.h这个文件中,可以看一下这个属性的上面一行,@interface UIViewController (UITabBarControllerItem) 系统函数其实是在这个文件中实现了一个UIViewController的扩展,是UIViewController的属性。

    2019-08-07
    1
    2
  • 执笔,封心
    setViewControllers:@[] @[]是加入对象的意思 , 但是[CON1...CON4]这里面全放进去,是以数组的形式还是转换成对象的之后,返回的是数组还是什么呢?

    作者回复: @[]是数组哈 @{}是字典 @()是转化成对象哈

    2019-04-23
    2
  • 非斯文人士
    老师如何快速补全代码,和查找系统API函数

    作者回复: 查找系统API 可以使用 File - Open Quickly,快捷键是shift+command+O 。 补全是xcode的能力哈,一般有提示后通过上下选择,点击tab或者回车确认。

    2020-06-15
    1
  • 疯狂土豆
    老师,对于刚刚学ios的人怎么耍,现在的教程有点不一样。ios更新的太快,工具和语法和教程有点不匹配。很多demon都实现不了

    作者回复: 虽然技术不断更新,但是都是在之前技术上的发展和延伸。所以不管学习iOS或者其他,只要从一个阶段开始深入的学习和练习,即使之后有更新,也会很快的适应。同时对于系统级别的更新,无外乎是更改API、推出新功能等等,但是对于客户端开发甚至大前端的开发,核心的原理和技术的架构都是不变的。所以初学时不需要追逐新技术,也不用焦虑,从一点沉心深入下去就好,之后你会发现新技术也不像之前那么遥远。

    2019-12-15
    1
    1
  • marshal
    viewController 的命名GT是代表什么意思?

    作者回复: 极客时间 Geek Time 哈

    2019-11-29
    1
  • 十万嬉皮
    老师,ios13更新之后是不是变动挺大的。。我这样写跑不起来会报错

    作者回复: 是的。iOS13之后,appdelegate的指责发生了变化,具体的可以参考https://developer.apple.com/videos/play/wwdc2019/42 这个session。 简单的说和UI生命周期相关的回调都交给了SceneDelegate 这个delegate,而appdelegate主要负责 app 生命周期相关的回调。对于window来说,作为一个特殊的UI,也自然的变成了SceneDelegate的一个property,我们可以在SceneDelegate的头文件中找到它,并在willConnectToSession这个函数中使用。简单的说,在iOS13中将对应的代码移动到SceneDelegate.m中即可。

    2019-10-10
    1
  • Jay
    老师,我把你代码里的icon.bundle放到我的项目里图片运行后图片不显示啊

    作者回复: 正确的添加进来了么?可以在build Phases的Copy Bundle Resources中看下是否有这个bundle,没有的话需要添加下引用

    2019-09-04
    1
  • Geek_711
    为什么我照着这节的敲了一遍,运行之后只显示白色,那位道友帮我看看代码,

    作者回复: 可以对着源码过一遍看看哪里不一样,如果还是找不到问题的话,可以上传代码到github或者其他到仓库,然后留言对应的地址就好。

    2020-03-07
    2
  • Agony
    老师,按照你讲的UITabBarController 时,运行报错: Thread 1: signal SIGABRT 打印往下走 Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0),是什么原因啊,急~~~

    作者回复: 上传下代码,我帮你看下

    2019-11-15
    1
  • Colin
    看到这 是不是应该先讲一下工程的结构

    作者回复: 工程的结构是一直调整的,中间穿插着重构和功能的修改等等,所以如果最开始就提供一个完整的结构,或许不利于大家的理解。可以先继续的看一看,如果有迷惑的地方可以直接留言哈~

    2019-09-07
  • beenchaos
    老师好:
    15:28 中的icon.bundle资源是如何添加到项目中的哈?

    作者回复: 就是像正常文件添加一样哈, 在创建的时候右上角的filter中搜索bundle,然后正常创建即可,然后就像正常文件夹一样使用就可以啦。在后面的课程中也有详细的介绍使用imageAsset以及bundle的区别等等。

    2019-08-30
  • 帅的科幻的男人
    [self.view addSubview:({
            UIImageView *likeImageView = [[UIImageView alloc] initWithFrame:CGRectZero];
            likeImageView.layer.masksToBounds = YES;
            likeImageView.layer.cornerRadius = 15;
            likeImageView.translatesAutoresizingMaskIntoConstraints = NO;
        
            likeImageView;
        })];

    self.titleLab = [[UILabel alloc]init];
    self.titleLab.textColor = STHexColor(@"#333333");
    self.titleLab.font = MYF(16);
    self.titleLab.text = @"说点什么";
    self.titleLab.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:self.titleLab];
    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
          make.right.left.equalTo(self.view);
          make.bottom.equalTo(self.textField.mas_top).offset(-MYH(20));
          make.height.offset(MYH(20));
    }];

    [self.view addSubview:({ })];和[self.view addSubview:self.titleLab];有啥区别吗

    作者回复: 没有区别,就是写法不同

    2019-08-20
  • 胖成一条河
    代码下载不下来。。。

    作者回复: github上别的项目应该也不行吧?这个应该是网络或者代理的问题。可以搜索下如何科学上网,或者检查下代理的配置,以及git的配置等。

    2019-08-08
收起评论
看过的人还看
iOS开发高手课

戴铭  前滴滴出行技术专家

47讲 | 12310 人已学习

新人首单 ¥19.9 原价 ¥99
Swift核心技术与实战

张杰  美团点评高级技术专家

120讲 | 2075 人已学习

新人首单 ¥29.9 原价 ¥129
数据结构与算法之美

王争  前Google工程师

80讲 | 85504 人已学习

新人首单 ¥29.9 原价 ¥129
Flutter核心技术与实战

陈航  美团点评高级技术专家

48讲 | 7607 人已学习

新人首单 ¥19.9 原价 ¥99