继续上篇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. loadrunner 脚本优化-事务时间简介

    脚本优化-事务时间简介 by:授客 QQ:1033553122 事务概念 事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容 ...

  2. git 入门教程之里程碑式标签

    "春风得意马蹄疾,一日看尽长安花",对于项目也是如此,最值得期待的恐怕就要数新版本发布的时刻了吧?每当发布新版本时要么是版本号命名(比如v0.0.1)或者代号命名(比如Chelse ...

  3. 《node.js权威指南》读书笔记

    第一章 node.js介绍 非阻塞型I/O机制 当在访问数据库取得搜索结果的时候,在开始访问数据库之后,数据库返回结果之前,存在一段等待时间. 在传统的单线程处理机制中,在执行了访问数据库的代码之后, ...

  4. mssql sqlserver 验证整型函数分享

    转自:http://www.maomao365.com/?p=6227 摘要: 下文将制作一个isnumber验证整型的函数,供在sql脚本中做数值判断,如下所示: 例: 实现原理:判断 是否包含特殊 ...

  5. mssql sqlserver 规范使用方法分享

    转自:http://www.maomao365.com/?p=5586 摘要:下文主要讲述sql server表设计及脚本编写中,相关规范 ———————————数据表字段类型选择:字符类型根据长度选 ...

  6. linux源

    系统:centos7 x86_64 一.配置本地yum源 1.1加载光驱 1.2挂载到系统 注:如果要长期使用最好把整个镜像文件拷贝到系统下 1.3配置文件 路径/etc/yum.repos.d/ 打 ...

  7. MySQL 8.0.11安装配置

    官网地址:https://dev.mysql.com/downloads/mysql/ 我这里是RHEL6.5的系统,因此选择RedHat 6 x86,64bit操作系统---下载第一个RPM Bun ...

  8. 两层c:forEach循环嵌套

    jsp中两级菜单如何用c:forEach输出 items 要被循环的信息 否 无 begin 开始的元素(0=第一个元素,1=第二个元素) 否 0 end 最后一个元素(0=第一个元素,1=第二个元素 ...

  9. SAP 维护视图创建与修改

    维护视图创建与修改 维护视图创建 T-CODE:SE54 维护ABAP数据字典 维护已生产的对象 注意:当维护视图修改后,需要删除已生成的对象,重新创建已生成的对象,否则无法显示,这个小窍门我花了半天 ...

  10. Unity Shader 基础(3) 获取深度纹理

    Unity提供了很多Image Effect效果,包含Global Fog.DOF.Boom.Blur.Edge Detection等等,这些效果里面都会使用到摄像机深度或者根据深度还原世界坐标实现各 ...