猫猫分享。必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://blog.csdn.net/u013357243?

viewmode=contents

一:加入导航控制器

上一篇博客完毕了对底部的TabBar的设置,这一章我们完毕自己定义导航控制器(NYNavigationController)。

为啥要做自己定义呢。由于为了更好地封装代码,而且系统的UINavigationController不能满足我们的需求了,所以得自己定义。

首先。我们在NYTabBarViewController的
- (void)addChildVc:(UIViewController )childVc title:(NSString )title image:(NSString )image selectedImage:(NSString )selectedImage方法中写了这个:

 // 先给外面传进来的小控制器 包装 一个导航控制器NYNavigationController *nav = [[NYNavigationController alloc] initWithRootViewController:childVc];// 加入为子控制器[self addChildViewController:nav];

来给设置的各个Controller包装一个导航控制器。

这时候系统会自己主动给加入一个。

然后呢我们要对导航控制器进行改进。

框架结构

眼下情况下的UI架构例如以下图所看到的:一个IWTabBarController拥有4个导航控制器作为子控制器,每一个导航控制器都有自己的根控制器(栈底控制器)


重要代码

1.给控制器包装一个导航控制器而且放入tabbarController中

// 先给外面传进来的小控制器 包装 一个导航控制器NYNavigationController *nav = [[NYNavigationController alloc] initWithRootViewController:childVc];// 加入为子控制器[self addChildViewController:nav];

二:导航控制器左右item的设置

在NYMessageCenterViewController中我们加入了cell。并使之能够点击。点击后进入到还有一个界面(test1) 再点击界面的view进入另外一个界面(test2)

首先放入20行假数据——UITableView的数据源方法

返回一组,20行,每行内容cell设置

#pragma mark - Table view data source 数据源方法- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
#warning Potentially incomplete method implementation.// Return the number of sections.return 1;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
#warning Incomplete method implementation.// Return the number of rows in the section.return 20;
}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{static NSString *ID = @"ID";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];}cell.textLabel.text = [NSString stringWithFormat:@"test~~~~message - %d", indexPath.row];return cell;
}

然后是cell的点击方法了 不用死记全部方法名字,简单敲一下tableview 查找didSele方法(学iOS对英语挺高老快了)灵活运用xcode的自己主动提示功能。

#pragma mark - 代理方法
//cell的点击事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{NYTest1ViewController *test1 = [[NYTest1ViewController alloc] init];test1.title = @"測试1控制器";[test1.navigationController setNavigationBarHidden:NO];[self.navigationController pushViewController:test1 animated:YES];
}

test1是我们自己做的一个測试类。当中我们做了两个如图:

这时候,我们的消息界面就有了cell的数据而且能够点击了。如图效果:

(到test2的push和1的一样,只是是用的view的touch方法)

这时候我们要做导航控制器的左右item了。
然后我们设置导航控制器的左右item (写私信button等)
如图:


- (void)viewDidLoad
{[super viewDidLoad];self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"写私信" style:UIBarButtonItemStylePlain target:self action:@selector(composeMsg)];//设置右側button为不可点击状态self.navigationItem.rightBarButtonItem.enabled = NO;NYLog(@"NYMessageCenterViewController-viewDidLoad");}

当中的UIBarButtonItem 的创建方法不是系统给的,而是我们为了实现黄色的效果自己写的分类实现的。

分类实现UIBarButtonItem的自己定义创建方法:


//
//  UIBarButtonItem+Extension.m
//  猫猫微博
//
//  Created by apple on 15-6-4.
//  Copyright (c) 2015年 znycat. All rights reserved.
//#import "UIBarButtonItem+Extension.h"@implementation UIBarButtonItem (Extension)/***  创建一个item**  @param target    点击item后调用哪个对象的方法*  @param action    点击item后调用target的哪个方法*  @param image     图片*  @param highImage 高亮的图片**  @return 创建完的item*/
+(UIBarButtonItem *)itemWithTarget:(id)target action:(SEL)action image:(NSString *)image highImage:(NSString *)highImage
{UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];//设置图片[backBtn setBackgroundImage:[UIImage imageNamed:image] forState:UIControlStateNormal];[backBtn setBackgroundImage:[UIImage imageNamed:highImage] forState:UIControlStateHighlighted];[backBtn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];//设置尺寸CGSize imageSize = backBtn.currentBackgroundImage.size;backBtn.frame = CGRectMake(0, 0, imageSize.width, imageSize.height);UIBarButtonItem *itemBtn = [[UIBarButtonItem alloc] initWithCustomView:backBtn];return itemBtn;}@end

这里设置尺寸用到了

CGSize imageSize = backBtn.currentBackgroundImage.size;

在我们学习UI的transform的时候,我们知道 是不能直接这么设置size的。可是为啥这里能呢? 非常easy ,我们对UIView写了一个分类

//
//  UIView+Extension.m
//  猫猫微博
//
//  Created by apple on 15-6-2.
//  Copyright (c) 2015年 znycat. All rights reserved.
//#import "UIView+Extension.h"@implementation UIView (Extension)
-(void)setX:(CGFloat)x
{CGRect frame = self.frame;frame.origin.x = x;self.frame = frame;
}-(CGFloat)x
{return self.frame.origin.x;
}
-(void)setY:(CGFloat)y
{CGRect frame = self.frame;frame.origin.y = y;self.frame = frame;
}-(CGFloat)y
{return self.frame.origin.y;
}-(void)setWidth:(CGFloat)width
{CGRect frame = self.frame;frame.size.width = width;self.frame = frame;
}-(CGFloat)width
{return self.frame.size.width;
}-(void)setHeight:(CGFloat)height
{CGRect frame = self.frame;frame.size.height = height;self.frame = frame;
}-(CGFloat)height
{return self.frame.size.height;
}-(void)setSize:(CGSize)size
{CGRect frame = self.frame;frame.size = size;self.frame = frame;
}-(CGSize)size
{return self.frame.size;
}-(void)setOrigin:(CGPoint)origin
{CGRect frame = self.frame;frame.origin = origin;self.frame = frame;
}-(CGPoint)origin
{return self.frame.origin;
}@end



而且为了改变系统原生的 漂亮的蓝色情调,换成微博的黄色。。


我们要重写NYNavigationController初始载入方法 (initialize)以及重写pushViewController方法,让push 的时候会自己主动带着箭头button和右边的很多其它button(UIBarButtonItem)

//
//  NYNavigationController.m
//  猫猫微博
//
//  Created by apple on 15-6-4.
//  Copyright (c) 2015年 znycat. All rights reserved.
//#import "NYNavigationController.h"@interface NYNavigationController ()@end@implementation NYNavigationController+(void)initialize
{// 设置整个项目全部item的主题样式UIBarButtonItem *item = [UIBarButtonItem appearance];// 普通状态NSMutableDictionary *textAttrsNormal = [NSMutableDictionary dictionary];textAttrsNormal[NSForegroundColorAttributeName] = [UIColor orangeColor];textAttrsNormal[NSFontAttributeName] = [UIFont systemFontOfSize:14];[item setTitleTextAttributes:textAttrsNormal forState:UIControlStateNormal];// 不可用状态NSMutableDictionary *textAttrsDisabled = [NSMutableDictionary dictionary];textAttrsDisabled[NSFontAttributeName] = [UIFont systemFontOfSize:14];textAttrsDisabled[NSForegroundColorAttributeName] = [UIColor colorWithRed:0.6 green:0.6 blue:0.6 alpha:0.7];[item setTitleTextAttributes:textAttrsDisabled forState:UIControlStateDisabled];}/***  重写这种方法目的:能够拦截全部push进来的控制器**  @param viewController 即将push进来的控制器*/
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{// 这时push进来的控制器viewController,不是第一个子控制器(不是根控制器)if (self.viewControllers.count > 0) {/* 自己主动显示和隐藏tabbar */viewController.hidesBottomBarWhenPushed = YES;// 设置左边的箭头buttonviewController.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithTarget:self action:@selector(back) image:@"navigationbar_back" highImage:@"navigationbar_back_highlighted"];// 设置右边的很多其它buttonviewController.navigationItem.rightBarButtonItem = [UIBarButtonItem itemWithTarget:self action:@selector(more) image:@"navigationbar_more" highImage:@"navigationbar_more_highlighted"];}[super pushViewController:viewController animated:animated];}-(void)back
{
#warning 这里要用self。不是self.navigationController// 由于self本来就是一个导航控制器。self.navigationController这里是nil的[self popViewControllerAnimated:YES];
}-(void)more
{//回到根[self popToRootViewControllerAnimated:YES];
}
@end

最后就是各个页面的调用了
首页:

- (void)viewDidLoad
{[super viewDidLoad];/* 设置导航栏上面的内容 */self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithTarget:self action:@selector(friendSearch) image:@"navigationbar_friendsearch" highImage:@"navigationbar_friendsearch_highlighted"];self.navigationItem.rightBarButtonItem = [UIBarButtonItem itemWithTarget:self action:@selector(pop) image:@"navigationbar_pop" highImage:@"navigationbar_pop_highlighted"];}

我:


- (void)viewDidLoad
{[super viewDidLoad];self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"设置" style:0 target:self action:@selector(setting)];
}

消息里面的写私信(这里设置默认不可用状态)

- (void)viewDidLoad
{[super viewDidLoad];self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"写私信" style:UIBarButtonItemStylePlain target:self action:@selector(composeMsg)];//设置右側button为不可点击状态self.navigationItem.rightBarButtonItem.enabled = NO;NYLog(@"NYMessageCenterViewController-viewDidLoad");}

猫猫学iOS 之微博项目实战(2)微博主框架-自己定义导航控制器NavigationController相关推荐

  1. 猫猫学IOS(四)UI之半小时搞定Tom猫

    话不多说 先上效果 项目源码素材下载地址: Tom猫游戏代码iOS 素材http://blog.csdn.net/u013357243/article/details/44457357 效果图 曾经风 ...

  2. (素材源代码)猫猫学IOS(四)UI之半小时搞定Tom猫

    下载地址:http://download.csdn.net/detail/u013357243/8514915 以下是执行图片展示 制作思路以及代码解析 猫猫学IOS(四)UI之半小时搞定Tom猫这里 ...

  3. 猫猫学IOS(六)UI之iOS热门游戏_超级猜图

    猫猫分享,必须精品 素材地址:http://blog.csdn.net/u013357243/article/details/44539069 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:ht ...

  4. (素材源码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI

    猫猫分享,必须精品 先看效果 代码学习地址: 猫猫学IOS(五)UI之360等下载管理器九宫格UI 猫猫学IOS(五)UI之360等下载管理器九宫格UI http://blog.csdn.net/u0 ...

  5. 猫猫学iOS之最近的反思

    其实很早以前就想写点了,虽然猫猫现在还是学生,但是就自学方面,猫猫觉得自己水平还可以--注意,我不是大神,我只是一名小小的菜猫... 首先简单说一下自己吧,本人猫猫,真名看博客名字,目前大四,自学编程 ...

  6. 猫猫学iOS之小知识之_xcode插件的删除方法_自动提示图片插件KSImageNamed有时不灵_分类或宏之类不能自动提示,

    猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:解决解决自动提示图片插件KSImageNamed有时不灵_分 ...

  7. 跟我一起学PyTorch-09:PyTorch项目实战

    在前面章节中,深入阐述了PyTorch和深度学习的基础知识,包括PyTorch的安装.常用命令和基本操作,讲述了深度神经网络.卷积神经网络.循环神经网络和自编码器等.初步学习了深度学习在图形分类.自然 ...

  8. 9大项目实战!tensorflow2.0框架实战(免费资料+干货合集)

    (翻至底部还有超多免费资料+干货合集) 随着PyTorch的不断发展,你是否开始抛弃TF转而向PT发起进攻了呢? 即便现在Pytorch发展迅速,但TensorFlow就像一个定时炸弹,你不知道什么时 ...

  9. 猫猫学iOS之微博国际版的一个关于线程调用的异常修复Main Thread Checker: UI API called on a background thread 异常

    问题 优化微博国际版时候,发现控制台打出了这样的异常: Main Thread Checker: UI API called on a background thread: -[UIApplicati ...

最新文章

  1. NSStream线程阻塞处理
  2. Facebook收购GrokStyle:布局AI零售
  3. 23. Leetcode 86. 分隔链表 (链表-基础操作类-分隔链表)
  4. git add .出现尚未暂存以备提交的变更
  5. Compiling Fortran
  6. 转载:【OpenCV入门教程之四】 ROI区域图像叠加初级图像混合 全剖析
  7. Mac 编译报错 symbol(s) not found for
  8. [yii2] 实现所有action方法之前执行一段代码或者方法
  9. Jmeter使用之高效组织接口自动化用例技巧
  10. CADD课程学习(7)-- 模拟靶点和小分子相互作用 (半柔性对接 AutoDock)
  11. 华为模拟器eNSP下载与安装(win10系统)
  12. 主流web前端技术框架有哪些?
  13. 如何使用Kdiff3作为GIT merge图形化工具
  14. 计算机电子极域控制,极域电子教室的反控制实现【无需教师端】
  15. 脸上长痘部位对应的身体问题
  16. 日知录-章0:当我们在谈论大数据时,我们在谈什么?
  17. PostgreSql增删改(与mysql差异)
  18. R语言的graphics功能(画图)
  19. UltraEdit\UEStudio 的 SSHTelnet 功能教程
  20. 如何防止网站被黑客入侵,避免网站被黑的防御方法

热门文章

  1. CCNA网络小菜鸟笔记之(第十一章, 广域网协议)
  2. 修复Oracle9i中DBA的密码
  3. (转)The POM for 0.0.1-SNAPSHOT is missing, no dependency informat
  4. 前端开发如何做好本地接口模拟
  5. Vue2.0+ElementUI+PageHelper实现的表格分页
  6. 服务端I/O性能:Node、PHP、Java、Go的对比
  7. 分布式事务 - 梁飞的博客 - ITeye博客
  8. 自定义注解 相关知识汇总(转)
  9. bzoj4195 noi2015 day1 t1
  10. Black Box(POJ 1442·TREAP实现)