iOS开发 - 第05篇 - 项目 - 01 - 搭建框架

实现:仿新浪微博

1、项目配置

1> 取消横竖屏

2> 设置图标和启动图片

3> 删除MainStoryboard,全部代码创建

2、添加TabBarController

2.1 创建窗口

1>在didFinishLaunchingWithOptions方法中,创建窗口,设置根控制器,显示窗口

2> 添加TabBarController的子控制器

3>抽取重复代码

注:上述方法限制每次创建的都是UIViewController,实际使用中,需要设置不同的控制器作为TabBarController的子控制器

4> 改进

添加HWHomeViewController等控制器,在创建后传递给上述设置方法,设置Item和图片

2.2 自定义HWTabBarViewController

注:上述创建的四个控制器应该属于TabBarController,由TabBarController去管理,而且HWAppDelegate代理的功能主要是创建窗口,设置根控制器TabBarController,不需要管TabBarController里面的具体实现,因此上述代码不应该放在HWAppDelegate方法中,应该单独抽取出来,在HWTabBarViewController的viewDidLoad方法中实现添加子控制器

3、添加NavigationController

3.1 项目结构

3.2 包装导航控制器

3.3 导航控制器跳转

1> HWMessageCenterViewController假数据

2> 点击Cell跳转

4、自定义导航控制器

4.1 设置导航控制器leftBarButtonItem和rightBarButtonItem

箭头:返回上一个控制器

三点:返回导航控制器的根控制器

1> 基本实现

注:对于自定义UIButton(或者其他UI控件),必须设置其尺寸,否则可能不会显示!!!

注:UIView写分类

注:当需要修改控件的尺寸的时,往往需要先取出frame,再修改frame,最后再设置frame,比较麻烦,可以写一个UIView的分类,封装修改尺寸的方法!

重写上面上述属性的setter/getter方法,设置/取出控件frame,再将头文件写到pch文件中,其他类可以直接调用

2>其他控制器跳转时也实现上述要求

若其他控制器跳转时,也需要实现设置导航控制器为同样的Item,则直接将上述代码复制到每个控制器的viewDidLoad方法中即可。

但是,若控制器很多,则上述重复代码复制太多,应该抽取出来。

方法一:考虑继承

但是对于控制器来说,一般不使用继承,因为控制器种类很多,不可能将所有控制器继承自同一个控制器,通过一个控制器来实现统一。

比如:导航控制器中既有UIViewController,又有UITableViewController,且需要同时设置导航控制器的Item,则不能通过继承同一个控制器,设置其Item来实现。

方案二:自定义导航控制器

重写push方法,就可以得到传进来的控制器参数

4.2 自定义导航控制器

1> 在3.2节中,包装导航控制器添加到HWTabBrViewController中时,包装的导航控制器为自定义导航控制器

2>重写自定义导航控制器的push方法!!!

注1:此时每个控制器的导航栏都显示同样的Item!

注2:若某个特定的控制器,其导航栏需要显示另一个Item(或者清空),则可以在其viewDidLoad方法中直接设置即可,会覆盖自定义导航控制器中的操作!

注3:将隐藏TabBar的操作也封装到自定义导航控制器的push方法中,但是需要放在调用父类的push方法之前,否则不会隐藏!

5、项目文件分类

Home(首页)、MessageCenter(消息)、Discover(发现)、Profile(我):四个文件夹存放不同功能模块,里面分别以MVC结构划分

Main(主要):存放公共模块,包含MVC结构(主框架)、Category(分类)、Lib(第三方框架)、Other(HWAppDelegate、main.m)

Temp(临时):存放临时文件,如用于测试的控制器

6、封装UIBarButtonItem的创建

6.1 Item创建分析

之前对设置导航栏Item内容,封装到自定义导航控制器的push方法中,但是每个根控制器的导航栏内容,仍然需要设置其Item内容。

方法:在根控制器(如HWHomeViewController)的viewDidLoad方法中设置。

注:带来问题,每个根控制器都需要这样设置左右的Item,而且代码跟导航控制器的push方法中设置Item的代码重复

6.2 初步封装

将HWHomeViewController中的Item创建方法抽取出来,但是这样只能保证在HWHomeViewController中能够快速创建,在其他控制器中仍然需要重复代码创建。

6.3 创建UIBarButtonItem分类

注意:一定要添加target参数,用于表示哪个对象,如果直接将上面的代码复制过来是self,会导致点击Item的时候调用分类的action方法(属于控制器,不属于Item),程序崩溃!!!并将头文件放到pch文件中。则在需要创建Item的时候,直接调用分类的方法即可!!!

如:

7、小结

8、设置导航栏主题

注:消息控制器中设置导航栏右边Item(写私信)不使能,若将enable
= NO放到viewDidLoad方法中,主体来不及渲染,会没有显示灰色,应该放在viewWillAppear方法中

注1:造成上述问题的主要原因是:由于View采用的是懒加载,在创建View的时候就会调用viewDidLoad方法,之前在TabBarController的addChildVc方法中,设置了每个View的随机色,用于测试,此时就会调用viewDidLoad方法,设置enable,而在这之后才会去调用下面的自定义导航控制器,里面再去设置主题,导致调用顺序先后出现问题,因此Item没有显示灰色!!!

注2:而且若设置随机色,则四个控制器的view均一口气创建完(均会调用viewDidLoad方法),这种做法不对,应该在需要使用相应控制器的时候再去创建控制器的view,将设置随机色的代码注释掉即可,且可将设置Item的enable放到viewDidLoad方法中!

时间: 2024-08-06 17:59:25

iOS开发 - 第05篇 - 项目 - 01 - 搭建框架的相关文章

iOS开发 - 第05篇 - 项目 - 11 - const & git & 项目重构

1.发微博键盘最近标签页完善 问题: 1>表情出现重复 2>其他标签页转换到最近标签也没有及时出现最新使用表情 1.1 表情实时刷新 方法一:切换到最近标签页,刷新最新使用表情 注:需要在listView中表情数组的setter方法中先移除之前的控件,并在最后[selfsetNeedsLayout]; 方法二:上述方法只能在其他标签页切换到最近标签页的时候刷新表情,若在最近页需要点击表情按钮立即刷新,需要监听表情按钮点击的通知 1.2 表情重复问题 在表情工具类,存储表情的时候增加判断,删除重

iOS开发 - 第05篇 - 项目 - 10 - 发微博

1.点击表情 1.1 表情放大界面 1.2 实现思路 1>监听表情按钮点击 2>同一时间只能显示一个放大镜,创建一个即可,不用重复创建 3>放大镜应该作为一个整体HWEmotionPopView,而且比较简单,用XIB来实现即可,提供类方法 4>在HWEmotionPageView中懒加载HWEmotionPopView 注1:HWEmotionPopView添加位置问题,若添加在HWEmotionPageView上面,则会被上面工具台挡住,因此,应该添加到最上面的窗口UIWind

iOS开发 - 第05篇 - 项目 - 12 - 图文混排

1.首页微博文字处理 对于之前微博项目中首页:微博文字中的用户名.话题.链接等文字需要高亮显示,表情字符串需要显示对应表情. 思路: 1>之前微博中的文字使用NSString,要达到不同文字的高亮显示,需要使用NSAttributedString 2>微博模型中增加一个属性,代表属性字符串 /** string     微博信息内容*/ @property(nonatomic, copy) NSString *text; /** string     微博信息内容 -- 带有属性的(特殊文字会

iOS开发 - 第05篇 - 项目 - 02 - 导航栏

1.Debug下NSLog 2.Xcode图片拉伸 直接选中图片,在右侧属性中设置即可,避免代码拉伸. 3.添加搜索框 在发现控制器的导航栏中添加一个搜索框. 3.1 通过UISearchBar 系统自带的UISearchBar并不好用,不能改变其高度. 3.2 通过UITextField 3.3 自定义搜索框 注:由于上述创建搜索框控件在其他地方也有可能用得上,因此最好将其抽取出来,自定义一个搜索框控件 4.弹出下拉菜单 4.1 界面 4.2 设置导航栏的titleView 注1:设置UIBu

iOS开发 - 第05篇 - 项目 - 04 - OAuth授权 & 首页

1.存储帐号信息 1.1 基本实现 由于一旦授权成功,新浪返回的accessToken是同一个值(针对同一个第三方应用,同一个账号),为避免每次都重新登录,应该讲accessToken存储起来. 实现:先检测沙盒里面是否存在accessToken,若无,则意味从来没有登陆过,加载登录界面,一旦成功登录,就将获得的accessToken存进沙盒,下次进来就不需要再进行登录,直接从沙盒中取出accessToken,进入首页,获取用户数据. 1>在发送请求,成功获取accessToken方法后,将返回

iOS开发 - 第05篇 - 项目 - 05 - 首页

1.下拉刷新 1.1 进入首页自动刷新 1.2 显示最新微博数量 注:弹出的UILabel应该添加到导航控制器的View上,而不应该添加到tableView上,否则会更随tableView一起滚动!!! 在发送请求成功后,调用下面方法(注意动画): 2.添加上拉刷新控件 1> 自定义HWLoadMoreFooter(XIB) 1. UILabel利用autoLayout填充View 2.添加转圈控件,勾选动画 2>提供类方法加载XIB控件 3> 添加到tableView的tableFoo

iOS开发 - 第05篇 - 项目 - 03 - 版本新特性 & OAuth授权

1.版本新特性 1.1 界面 程序第一次启动的时候会弹出新特性界面,之后启动不会出现. 1.2 实现思路 1> 新建一个HWNewfeatureViewController(继承自UIViewController) 2> 先将其设置为整个程序的根控制器,用于演示 3> 使用UIScrollView 4>添加UIPageControl 5> 设置UIScrollView代理,监听滚动,设置UIPageControl 2.控制器切换 2.1 一个View中显示其他控制器的View

iOS开发 - 第04篇 - 网络 - 01 - NSOperation & 网络基础

实现:Cell图片下载程序 源代码下载地址:点击打开链接 1.Cell图片下载程序 1.1 界面 1.2 基本思路 1> Storyboard中添加导航控制器,根控制器为UITableViewController 2> 新建HMAppsViewController,关联 3> 导入app.plist,新建HMApp,提供类方法,利用KVC,字典转模型 4>HMAPPViewController中懒加载模型数组 5> 实现ViewController数据源方法,设置Cell的t

iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController)

iOS开发——实战OC篇&环境搭建之Xib(玩转UINavigationController与UITabBarController) 前面我们介绍了StoryBoard这个新技术,和纯技术编程的代码创建界面,本篇我们将介绍一个老的技术,但是在很多的公司或者库里面还是使用这个技术,既然如此它肯定有他的好处,至于好处这里我就不一一介绍了.在Xcode5之前是只能使用Xib或者代码的,而代码又对于很多初学者来说算是一个难题.毕竟不知道怎么下手.所以我就总结了一下这段时间自己编写程序的一个实例来说明怎么