从 0 开发一款 iOS App
朱德权
腾讯高级工程师
24183 人已学习
新⼈⾸单¥59
课程目录
已完结/共 106 讲
第一章:课程简介和开发前的准备 (4讲)
第二章:实现App的基本界面 (33讲)
第三章:实现App的基础功能 (35讲)
时长 18:24
第四章:App功能扩展和完善 (34讲)
从 0 开发一款 iOS App
登录|注册
留言
16
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 11 | iOS基本页面框架的构成和实现
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 常见App类型及技术栈浅析
04 | 使用Xcode创建第一个工程
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的页面结构
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开发适配常用方法总结
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 | 结课测试&结束语
本节摘要

PDF 课件和源代码下载地址:

https://gitee.com/geektime-geekbang/geektime-ios-course

登录 后留言

全部留言(16)

  • 最新
  • 精选
小胖
我现在用的xcode 11,就出现了留言里出现的问题,代码: 放在 SceneDelegate.m self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]]; ViewController* viewController = [[ViewController alloc] init]; self.window.rootViewController = viewController; [self.window makeKeyAndVisible]; 也删除了plist中,main storyboard 相关的配置,一共删除了两处: 1、 Main storyboard file base name 2、Storyboard Name

作者回复: 1. 创建项目,使用默认的Storyboard,并且运行成功。 2. 在xcode左侧文件导航中,删除Main.stroyboard文件 3. 在xcode右侧 General中,调整MainInterface到LaunchScreen.storyborad 4. 在Info.plist中,删除Application Scene Manifest中Scene Configuration->Application Session Role->item 0->Stroyboard Name这行 5. 在SceneDelegate文件willConnectToSession函数中,添加和视频中类似的代码 UIWindowScene * windowScene = (UIWindowScene *)scene; _window = [[UIWindow alloc] initWithFrame:windowScene.coordinateSpace.bounds]; _window.windowScene = windowScene; [_window setRootViewController:[[UIViewController alloc] init]]; [_window makeKeyAndVisible]; 整体上看,其实和之前的操作相同,就是删除MainStory以及对应的引用关系,然后在Scene中加入自己的window和rootController。可以对比看下哪一步没有做哈~如果还是找不到问题,可以留言上传下代码,我帮你看下

2020-03-10
2
6
siberiawolf
按照老师留言中的操作完之后是黑屏的话,也有可能是代码没有写完。 将之前创建好的 viewController指定到window的rootViewController上即可。 ``` - (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; _window = [[UIWindow alloc] initWithFrame:windowScene.coordinateSpace.bounds]; ViewController *viewController = [[ViewController alloc] init]; _window.windowScene = windowScene; [_window setRootViewController: viewController]; [_window makeKeyAndVisible]; } ```

作者回复: 👍

2020-04-29
5
小胖
代码修改为一下,就可以正常运行, self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene]; ViewController* viewController = [[ViewController alloc] init]; self.window.rootViewController = viewController; [self.window makeKeyAndVisible];

作者回复: 👍👍👍

2020-03-10
2
5
Geek_123844
你好,我现在使用的是 UITabBarController 作为根视图,添加多个 navi。 所以想问一下,如果是 UINavigationController 作为根视图,那 tabbar 上面的多个 ViewController 就是共用一个 navigationItem, 那怎么给 ViewController 设置单独的 item title 呢?

作者回复: 可以使用SubView来实现。目前这两种方式 无论哪种都需要自定义的处理下,才能做到和主流App一样的交互,基本都不是原生的体验了

2019-04-30
2
4
星夜宝宝
我做的项目一般都用第一种呀,就是用tabBarController做为根控制器,然后老师说的推倒下一个控制器,我是写代码隐藏底部tabBar的. 效果是一样的。老师能说一下就是用nav做根控制器有什么好处吗?

作者回复: 这样来说比较简单,不用处理动画效果。

2019-04-23
4
Geek_1bd300
xcode11.0,把storyboard删掉之后编译没有错,但是运行的界面是全黑的了

作者回复: 示例工程应该是可以使用XCode11跑起来的,系统会向下兼容,并且主流的App也都要支持非iOS13的设备。那么对于在iOS13中新建工程,单独的根据视频删除storyboard是不行的。在删除main.storyboard的时候,在和课程中相同的删除操作之上,也需要删除在info.plist中的Application Scene Manifest中对应storyboard的默认设置。简单的来说如果不使用Main.storyboard,就需要把 info.plist 中 Main.storyboard相关的设置全部删除,并且在SceneDelegate中自己实现window。SceneDelegate和Appdelegate这部分在iOS13中也有了变化,可以参考对应课程下方的留言,或者直接看https://developer.apple.com/videos/play/wwdc2019/42 这个session

2019-12-10
2
2
雪飞❄️
去掉 storyboard 之后 程序怎么都跑不通,不知道是哪里都问题 显示出问题都是这一行 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 我Xcode 的版本号是 11.0 是和我用的Xcode是最新版有关么? 2019-09-28 16:07:01.828651+0800 exam02[11024:208041] -[AppDelegate setWindow:]: unrecognized selector sent to instance 0x600002edc040 2019-09-28 16:07:01.833348+0800 exam02[11024:208041] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate setWindow:]: unrecognized selector sent to instance 0x600002edc040' 老师帮忙看一下呢

作者回复: 是的。iOS13之后,appdelegate的指责发生了变化,具体的可以参考https://developer.apple.com/videos/play/wwdc2019/42 这个session。 简单的说和UI生命周期相关的回调都交给了SceneDelegate 这个delegate,而appdelegate主要负责 app 生命周期相关的回调。对于window来说,作为一个特殊的UI,也自然的变成了SceneDelegate的一个property,我们可以在SceneDelegate的头文件中找到它,并在willConnectToSession这个函数中使用。同时在删除main.storyboard的时候,在和课程中相同的删除操作之上,也需要删除在info.plist中的Application Scene Manifest中对应storyboard的默认设置

2019-09-28
1
d.keven
你好,我使用第二种方式实现后,push动画时,右上角有个黑色像素块是怎么回事呢,然后尝试使用了第一种方案+给ViewController设置hideBottomBarWhenPushed=YES,这样倒是也能隐藏tabbar,而且没有异常,但是back之后,tabbar没有重新显示,请问是怎么回事呢?

作者回复: 这边使用示例工程暂时没有发现,如果是你实现的代码,方便的化上传下代码,我帮你看下。

2020-05-09
Geek_Maggie
Xcode11 手动创建UIWindow 不用storyboard自带的,要删除Main.storyboard相关设置都有哪几项,老师能否讲明一下?刚刚手动删了一个Storyboard Name,似乎不对界面黑了

作者回复: 在删除main.storyboard的时候,在和课程中相同的删除操作之上,也需要删除在info.plist中的Application Scene Manifest中对应storyboard的默认设置。简单的来说如果不使用Main.storyboard,就需要把info.plist和Main.storyboard相关的设置全部删除,并且在SceneDelegate中自己实现window。SceneDelegate和Appdelegate这部分在iOS13中也有了变化,可以参考下面的留言,或者直接看https://developer.apple.com/videos/play/wwdc2019/42 这个session

2020-02-18
Geek_Maggie
xcode11中删除故事板不仅要删除视频里说的“Main storyboard file base name”,还需要删除在info.plist中的Application Scene Manifest这一项设置对吗?

作者回复: 是的,iOS13的问题可以看下本节课的留言哈。

2020-02-18
收起评论