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值是 ...
随机推荐
- (后端)JackSon将java对象转换为JSON字符串(转)
转载小金金金丶园友: JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的 ...
- 【转】c# [Serializable]的作用
http://blog.csdn.net/chinarenkai/article/details/3220452 如果你做远程方法调用(RPC)时,比如,服务器端有个类A及对象a,客户端需要无视网络的 ...
- Linux 最小化安装后IP的配置(DHCP获取IP地址)
图形化Linux的DHCP好配置,我就不讲了.主要将一下Linux最小化安装后IP的配置: linux最小化安装后没有ifconfig这个命令: yum install net-tools.x86_6 ...
- A problem has been detected and windows has been shut down to prevent damage to your computer.他么啥意思?看这里!【蓝屏】
A problem has been detected and windows has been shut down to prevent damage to your computer. 检测到问 ...
- Linux核心调度器之周期性调度器scheduler_tick--Linux进程的管理与调度(十八)
我们前面提到linux有两种方法激活调度器:核心调度器和 周期调度器 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要 因 ...
- KFCM算法的matlab程序
KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...
- 我的第一个SolidWorks图
1. 学习到的知识点 2. 完成的工程图 3. 感受 学习是一种快乐,学到新的知识要学会分享,只要坚持,就有那么一点点的成就. 4. 参考 SolidWorks帮助文档
- SpringCloud之初识Robbin---负载均衡
在上一篇中讲解Eureka注册中心的案例,我们启动了一个user-service,然后通过DiscoveryClient来获取服务实例信息,然后获取ip和端口来访问. 但是实际环境中,我们往往会开启很 ...
- 模拟placeholder
把这个记下来,主要是因为这里的 defaultValue 我之前竟然不知道 <input type="text" value="提示内容" onFocus ...
- 日常训练 dfs 之 拓扑排序
今天被拓扑排序给折磨了一天,主要就是我的一个代码有点小bug,真难找... 先来看看我今天写的题目吧! C. Fox And Names Fox Ciel is going to publish a ...