继续上篇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的更多相关文章

  1. UIImageView - BNR

    继续上节UINavigationController - BNR. 打开BNRDetailViewController.xib文件,向view中添加UIImageView对象,选中该对象,通过Attr ...

  2. iOS UINavigationController(内容根据iOS编程编写)

    我们知道 UITabBarController 对象,可以通过使用该对象,用户可以切换不同的屏幕.当要切换的各个屏幕之间没有相互依存关系的时候,该对象可以很好的完成任务.但是当多个屏幕互有关系的时候, ...

  3. UINavigationController

    知识点: 1)UINavigationController 2)UINavigationBar 3)UINavigationItem 4)UIToolBar ===================== ...

  4. 混合使用UITabBarController和UINavigationController

    混合使用这两个控件的好处是我们可以在NavigationBar添加更多的东西,如标题,按钮等.让用户能够获得更多的信息. UITabBarController的属性ViewControllers接受以 ...

  5. 基本组件的使用——UINavigationController

    作用:在多个ViewController中切换.UINavigationController内部以栈的形式维护一组ViewController, 因此,当导航进入一个新视图的时候,会以push的形式将 ...

  6. 解决UINavigationController在pushViewController时出现的"卡顿"问题

    进行开发中,遇到了个小问题: 在使用UINavigationController的-pushViewController:animated:执行入栈一个子控制器操作时(即最新栈顶子控制器),会出现推出 ...

  7. UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解

    (1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...

  8. IOS 学习 开发 自定义 UINavigationController 导航

    文件目录如下:基本导航顺序: root -> First -> Second -> Third.其中,FirstViewController作为 navigation堆栈的rootv ...

  9. APP标配控制器:UINavigationController

    导航控制器UINavigationController简介: 只要看到控制器界面上部有一个条就是导航控制器UINavigationController 导航控制器最上面有一个条是导航条高度44,Y值是 ...

随机推荐

  1. sdk manager闪退

    ,1确认好sdk环境变量是否都正确 命令行:android 来验证 2确定jdk是否安装正确 命令行:java   和  javac 都没有问题,就将sdk安装版覆盖安装下不要卸载,不然下载的太慢了 ...

  2. 深入理解Java虚拟机03--垃圾收集器与内存分配策略

    一.概述  哪些内存需要回收? 什么时候回收? 如何回收? 二.对象已死吗  1.引用计数算法  定义:给对象添加一个引用计数器,当增加一个引用时,加1,当一个引用时,减1; 缺陷:当对象之间互相循环 ...

  3. 2014年11月17~11月18日,杨学明老师《企业IT需求收集和实施》内训在湖南长沙某酒店成功举办!

    2014年11月17至18日,受湖南某软件企业的邀请,杨学明老师<企业IT需求收集和实施>内训在某长沙某五星级酒店成功举办!来自全国各地的IT高管和企业负责人参加了此次培训.杨学明老师分别 ...

  4. (python)数据结构---字典

    一.描述 由键值key-value组成的数据的集合 可变.无序的,key不可以重复 字典的键key要可hash(列表.字典.集合不可哈希),不可变的数据结构是可哈希的(字符串.元组.对象.bytes) ...

  5. JSON语法与JavaScript语法的区别

    JSON是独立于语言存在的,在不同的编程语言中对这种数据类型的实现不同,例如在JavaScript中使用JavaScript对象对这种数据格式进行实现,那么在java中当然是用java对象实现. 描述 ...

  6. 使用Visual Studio Team Services敏捷规划和项目组合管理(五)——组合管理

    使用Visual Studio Team Services敏捷规划和项目组合管理(五)--组合管理 组合待办事项为产品所有者提供关于几个敏捷特性团队工作的洞察.产品所有者可以将高优先级的目标定义为Ep ...

  7. C#-方法(八)

    方法是什么 方法是C#中将一堆代码进行进行重用的机制 他是在类中实现一种特定功能的代码块,将重复性功能提取出来定义一个新的方法 这样可以提高代码的复用性,使编写程序更加快捷迅速 方法格式 访问修饰符 ...

  8. Docker 从入门到实践(二)Docker 三个基本概念

    一.Docker 的三个进本概念? 了解 Docker 的三个基本概念,就可以大致了解 Docker 的生命周期. 镜像(Image) 容器(Container) 仓库(Repository) 二.镜 ...

  9. sftpdrive mtputty

    https://blog.csdn.net/junli_chen/article/details/77527250?locationNum=2&fps=1

  10. deeplearn.js

    http://blog.csdn.net/rongxiang111/article/details/78083867 <!DOCTYPE html> <html> <he ...