导航控制器与表格视图应用开发指南
立即解锁
发布时间: 2025-08-24 01:08:11 阅读量: 7 订阅数: 35 


iOS 5开发入门:探索iOS SDK核心概念与实践
### 导航控制器与表格视图应用开发指南
#### 1. 应用概述
我们即将构建的应用将展示如何处理与显示数据层次结构相关的常见任务。应用启动后,会呈现一个选项列表。列表中每一行代表一个不同的视图控制器,当选中某一行时,该视图控制器会被推送到导航控制器的堆栈中。每一行右侧的图标称为附件图标,其中灰色箭头图标是披露指示器,它提示用户点击该行会深入到另一个表格视图。
#### 2. 子控制器视图介绍
在构建应用前,先了解六个子控制器所显示的视图:
- **披露按钮视图**:点击顶层视图的第一行,会显示子视图。此视图中每行右侧的附件图标是详细披露按钮,它不仅是图标,更是用户可点击的控件。用户点击行和点击详细披露按钮可触发不同操作。例如,iPhone 的电话应用中,从收藏标签中选择某人的行可拨打电话,点击名字旁的披露按钮则可查看详细联系人信息;YouTube 应用中,选择一行播放视频,点击详细披露按钮可查看视频的更多详细信息。使用规则如下:
- 若行点击仅导致该行更详细的视图,且只需提供单一选择,不使用附件图标。
- 若行点击将导致新视图(非详细视图),用披露指示器(灰色箭头)标记该行。
- 若想为行提供两种选择,用详细披露按钮标记该行。
- **复选列表视图**:此视图允许从多个选项中选择一行,类似于 Mac OS X 中的单选按钮,使用复选标记来标记当前选中的行。
- **行控制视图**:该视图在每行的附件视图中添加了可点击的按钮,附件视图通常是表格视图单元格最右侧用于放置附件图标的部分,这里可用于创建其他控件。
- **可移动行视图**:用户可通过让表格进入编辑模式,触摸并拖动移动图标来重新排列列表中行的顺序。
- **可删除行视图**:通过编辑模式,用户可以从表格中删除行。
- **可编辑详细视图**:使用分组表格实现可编辑的详细视图,这种技术在 iPhone 预装应用中广泛使用。
#### 3. 应用框架搭建
通常,Xcode 提供了创建基于导航应用的模板,但我们将从头开始构建,以深入理解各部分的组合方式。具体步骤如下:
1. 在 Xcode 中,按 `⌘ + N` 创建新项目,从 iOS 应用模板列表中选择“Empty Application”,然后点击“Next”。
2. 设置产品名称为“Nav”,公司标识符为“com.apress”,类前缀为“BID”。确保不勾选“Use Core Data”和“Include Unit Tests”,勾选“Use Automatic Reference Counting”,并将设备家族设置为“iPhone”。
此时,模板仅提供了应用委托,没有视图控制器和导航控制器。为使应用运行,需要添加导航控制器(包括导航栏)以及一系列视图和视图控制器。
#### 4. 创建顶层视图控制器
对于表格视图,我们将继承 `UITableViewController` 而不是 `UIViewController`。继承 `UITableViewController` 可自动创建表格视图,无需使用 nib 文件。
创建步骤如下:
1. 在项目窗口中,选择项目导航器中的“Nav”文件夹,按 `⌘ + N` 或选择“File -> New -> New File…”。
2. 当新文件助手出现时,选择“Cocoa Touch”,再选择“Objective - C class”,然后点击“Next”。
3. 在“Class”字段中输入“BIDFirstLevelController”,在“Subclass of”字段中输入“UITableViewController”。仔细检查拼写后点击“Next”,确保在文件浏览器、“Group”和“Target”控件中选择了“Nav”文件夹或组,然后点击“Create”。
创建完成后,`BIDFirstLevelController.h` 文件内容如下:
```objc
#import <UIKit/UIKit.h>
@interface BIDFirstLevelController : UITableViewController
@end
```
#### 5. 设置导航控制器
目标是编辑应用委托,将导航控制器的视图添加到应用窗口。具体操作如下:
1. 编辑 `BIDAppDelegate.h`,添加 `navController` 属性:
```objc
#import <UIKit/UIKit.h>
@interface BIDAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) UINavigationController *navController;
@end
```
2. 编辑 `BIDAppDelegate.m`,导入 `BIDFirstLevelController.h` 头文件,添加 `@synthesize` 语句,并在 `application:didFinishLaunchingWithOptions:` 方法中进行以下操作:
```objc
#import "BIDAppDelegate.h"
#import "BIDFirstLevelController.h"
@implementation BIDAppDelegate
@synthesize window = _window;
@synthesize navController;
#pragma mark -
#pragma mark Application lifecycle
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch
BIDFirstLevelController *first = [[BIDFirstLevelController alloc]
initWithStyle:UITableViewStylePlain];
self.navController = [[UINavigationController alloc]
initWithRootViewController:first];
[self.window addSubview:navController.view];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
@end
```
在上述代码中:
- `BIDFirstLevelController` 是 `UITableViewController` 的子类,使用 `initWithStyle:` 方法可创建表格视图,无需 nib 文件。
- `UINavigationController` 使用 `initWithRootViewController:` 方法,传入顶层控制器 `BIDFirstLevelController` 来显示初始内容。
- 将导航控制器的视图添加到应用窗口,该视图是一个复合视图,包含屏幕顶部的导航栏和当前视图控制器要显示的内容。
#### 6. 数据处理与视图实现
为了让 `BIDFirstLevelController` 显示行列表,我们需要进行以下操作:
1. 创建 `BIDSecondLevelViewController` 类,使其继承自 `UITableViewController`,并添加 `rowImage` 属性:
```objc
// BIDSecondLevelViewController.h
#import <UIKit/UIKit.h>
@interface BIDSecondLevelViewController : UITableViewController
@property (strong, nonatomic) UIImage *rowImage;
@end
// BIDSecondLevelViewController.m
#import "BIDSecondLevelViewController.h"
@implementation BIDSecondLevelViewController
@synthesize rowImage;
@end
```
2. 修改 `BIDFirstLevelController.h`,添加 `controllers` 属性:
```objc
#import <UIKit/UIKit.h>
@interface BIDFirstLevelController : UITableViewController
@property (strong, nonatomic) NSArray *controllers;
@end
```
3. 实现 `BIDFirstLevelController.m`:
```objc
#import "BIDFirstLevelController.h"
#import "BIDSecondLevelViewController.h"
@implementation BIDFirstLevelController
@synthesize controllers;
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"First Level";
NSMutableArray *array = [[NSMutableArray alloc] init];
self.controllers = array;
}
- (void)viewDidUnload {
[super viewDidUnload];
self.controllers = nil;
}
#pragma mark -
#pragma mark Table Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section {
return [self.controllers count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *FirstLevelCell = @"FirstLevelCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
FirstLevelCell];
if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
```
0
0
复制全文
相关推荐









