UINavigationController - BNR
继续上篇UITableView的编辑操作。
当你初始化一个UINavigationController对象时,它将拥有一个根视图控制器,即UIViewController。根视图控制器一直存在于stack的底部。
UINavigationController有一个viewControllers数组属性,根视图控制器位于该数组的第一个。
UINavigationController的topViewController属性是一个指向stack顶部视图控制器的指针。
UINavigationController有自己的view属性,该view总是包含两个子视图,为UInavigationBar和topViewController的view。
在该程序中,我们将BNRItemsViewController作为UINavigationController的rootViewController。将一个navigation controller作为window的rootViewController。
修改application:didFinishLaunchingWithOptions:方法如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
BNRItemsViewController *itemsViewController = [[BNRItemsViewController alloc] init];
UINavigationController *navController = [[UINavigationController alloc]
initWithRootViewController:itemsViewController];
self.window.rootViewController = navController;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
创建一个新的、带XIB的视图控制器名为BNRDetailViewController。
在程序中,当用户点击一个item时,将转换到另一个可编辑item信息的视图中,该新的视图就由BNRDetailViewController控制。
修改BNRDetailViewController.xib文件如下:

其中,该view的Attributes Inspector的Simulated Metrics设置如下。主要将Top Bar设置为Translucent Navigation Bar。

为3个UITextField和最后的UILabel与在BNRDetailViewController.m的类扩展中的outlet建立连接。如下:

当你改变实例变量的名字,而没有更新XIB文件中的连接时,就会出现一个坏连接。或者,你完全删除了一个实例变量,但是没有在XIB文件中删除时也会出现坏连接。
接下类,将XIB文件的每一个UITextField对象,通过Control-Drag与File's Owner的delegate属性相连接。如下所示:

在BNRItemsViewController.m中导入BNRDetailViewController,如下:
#import "BNRDetailViewController.h"
当用户在表视图中点击了一行时,它的委托对象会接收到tableView:didSelectRowAtIndexPath:方法。因此在BNRItemsViewController.m中添加如下代码,当用户点击一行时,会出现编辑视图:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
BNRDetailViewController *detailViewController = [[BNRDetailViewController alloc] init];
[self.navigationController pushViewController:detailViewController animated:YES];
}
将item的数据传递到下一个视图中:
在BNRDetailViewController.h中添加如下属性:
@property (nonatomic, strong) BNRItem *item;
同时,在@interface前面,用如下代码引入BNRItem类:
@class BNRItem;
在BNRDetailViewController.m中导入BNRItem,如下:
#import "BNRItem.h"
当BNRDetailViewController的view在屏幕上显示的时候,它需要设置其子视图来显示item的属性。重写viewWillAppear:方法如下:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
BNRItem *item = self.item;
self.nameField.text = item.itemName;
self.serialNumberField.text = item.serialNumber;
self.valueField.text = [NSString stringWithFormat:@"%d", item.valueInDollars];
static NSDateFormatter *dateFormatter = nil;
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateStyle = NSDateFormatterMediumStyle;
dateFormatter.timeStyle = NSDateFormatterNoStyle;
}
self.dateLabel.text = [dateFormatter stringFromDate:item.dateCreated];
}
之后,修改tableView:didSelectRowAtIndexPath:方法如下:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
BNRDetailViewController *detailViewController = [[BNRDetailViewController alloc] init];
NSArray *items = [[BNRItemStore sharedStore] allItems];
BNRItem *selectedItem = items[indexPath.row];
detailViewController.item = selectedItem;
[self.navigationController pushViewController:detailViewController animated:YES];
}
在BNRDetailViewController.m中添加如下代码:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.view endEditing:YES];
// 保存更改
BNRItem *item = self.item;
item.itemName = self.nameField.text;
item.serialNumber = self.serialNumberField.text;
item.valueInDollars = [self.valueField.text intValue];
}
需要重新加载UITableView,这个用户就可以看到内容的改变了。即在BNRItemsViewController.m中添加如下代码:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];
}
修改导航栏:

打开BNRItemsViewController.m,修改视图控制器navigationItem的标题,可修改init方法如下:
- (instancetype)init {
self = [super initWithStyle:UITableViewStylePlain];
if (self) {
UINavigationItem *navItem = self.navigationItem;
navItem.title = @"Homepwner";
// 添加5个随机item
for (int i = ; i < ; ++i) {
[[BNRItemStore sharedStore] createItem];
}
}
return self;
}
打开BNRDetailViewController.m,修改器标题,可添加如下方法:
- (void)setItem:(BNRItem *)item {
_item = item;
self.navigationItem.title = _item.itemName;
}
对于每一个UINavigationView,其属性有:leftBarButtonItem,rightBarButtonItem和titleView。
在BNRItemsViewController.m中创建UIBarButtonItem对象,并且赋予target和action,即修改init方法如下:
- (instancetype)init {
self = [super initWithStyle:UITableViewStylePlain];
if (self) {
UINavigationItem *navItem = self.navigationItem;
navItem.title = @"Homepwner";
UIBarButtonItem *bbi = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self
action:@selector(addNewItem:)];
navItem.rightBarButtonItem = bbi;
navItem.leftBarButtonItem = self.editButtonItem;
// 添加5个随机item
for (int i = ; i < ; ++i) {
[[BNRItemStore sharedStore] createItem];
}
}
return self;
}
UIViewController有一个editButtonItem属性。当发送editButtonItem时,视图控制器就会创建一个title为Edit的UIBarButtonItem。当被用户点击时,其会发送setEditing:animated:方法给UIViewController。
在BNRItemsViewController.m文件中,注释掉headerView和toggleEditingMode:方法。
运行程序,结果如下:

程序代码:http://pan.baidu.com/s/1o6pI7Se
UINavigationController - BNR的更多相关文章
- UIImageView - BNR
继续上节UINavigationController - BNR. 打开BNRDetailViewController.xib文件,向view中添加UIImageView对象,选中该对象,通过Attr ...
- iOS UINavigationController(内容根据iOS编程编写)
我们知道 UITabBarController 对象,可以通过使用该对象,用户可以切换不同的屏幕.当要切换的各个屏幕之间没有相互依存关系的时候,该对象可以很好的完成任务.但是当多个屏幕互有关系的时候, ...
- UINavigationController
知识点: 1)UINavigationController 2)UINavigationBar 3)UINavigationItem 4)UIToolBar ===================== ...
- 混合使用UITabBarController和UINavigationController
混合使用这两个控件的好处是我们可以在NavigationBar添加更多的东西,如标题,按钮等.让用户能够获得更多的信息. UITabBarController的属性ViewControllers接受以 ...
- 基本组件的使用——UINavigationController
作用:在多个ViewController中切换.UINavigationController内部以栈的形式维护一组ViewController, 因此,当导航进入一个新视图的时候,会以push的形式将 ...
- 解决UINavigationController在pushViewController时出现的"卡顿"问题
进行开发中,遇到了个小问题: 在使用UINavigationController的-pushViewController:animated:执行入栈一个子控制器操作时(即最新栈顶子控制器),会出现推出 ...
- UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解
(1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...
- IOS 学习 开发 自定义 UINavigationController 导航
文件目录如下:基本导航顺序: root -> First -> Second -> Third.其中,FirstViewController作为 navigation堆栈的rootv ...
- APP标配控制器:UINavigationController
导航控制器UINavigationController简介: 只要看到控制器界面上部有一个条就是导航控制器UINavigationController 导航控制器最上面有一个条是导航条高度44,Y值是 ...
随机推荐
- PHP mkdir新建目录
一.在本目录下新建目录 <?php$dir_url = 'aaa/';if(!is_dir($dir_url)) { mkdir($dir_url, 0777);}?> 二.在级联创建 ...
- css文本超出隐藏显示省略号
p style="width: 300px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;"> 如 ...
- hdu-2018题(母牛问题)
HDU-2018题/*有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年的时候,共有多少头母牛?Input输入数据由多个测试实例组成,每个测试实 ...
- (其他)window10上好用的软件
1.everything:比我用电脑搜索快一些,(常用的搜索其实熟悉电脑的都会,不过想快一点) 如果你曾对效率工具有过研究,想必对 Everything 的名字不会陌生.这款仅有 1.3 MB 的小软 ...
- 淘宝开放平台使用WebClient,WebRequest访问时的错误提示导致麻烦
淘宝开放平台(TOP)提供OAuth2.0支持 通过C#的WebClient/WebRequest直接访问时会提示grant type is empty,这是一个非常恼人的错误,你会发现即使传了这个参 ...
- Electron开发笔记—electron-builder打包流程
该文章说明基于win平台下,mac及linux没有实验 关于electron-builder打包可以有两种方案: 1. 打包成文件夹及绿色免安装: electron-builder --dir(依赖w ...
- Orchard详解--第四篇 缓存介绍
Orchard提供了多级缓存支持,它们分别是: 1. 应用程序配置级缓存ICacheManager: 它用来存储应用程序的配置信息并且可以提供一组可扩展的参数来处理缓存过期问题,在Orchard中默认 ...
- MySQl ifnull()和substr()
SUBSTR(str,pos,len) substr用来截取字符串: str 被截取的字符串 pos 开始位置 len 长度 举个例子: substr('abc',1,2)='ab' IFNULL(e ...
- 缺少 mysqli 扩展。请检查 PHP 配置。
安装了新的lamp,想打开数据库,结果出现了这种错误: phpMyAdmin - 错误缺少 mysqli 扩展.请检查 PHP 配置. <a href="Documentation.h ...
- php学习----基本介绍及数据类型
php 官方手册:http://php.net/manual/zh/ 1.PHP(全称 Hypertext Preprocessor,超文本预处理器的字母缩写)是一种服务器端脚本语言,它可嵌入到 HT ...