iOS开发:自定义视图控制器、单元格原型与错误处理
立即解锁
发布时间: 2025-08-25 01:32:29 阅读量: 2 订阅数: 16 


iOS 6开发实战指南:从入门到精通
# iOS开发:自定义视图控制器、单元格原型与错误处理
## 1. 自定义视图控制器设置
### 1.1 为详情视图控制器设置自定义类
若要使详情视图控制器显示 `AppDetails` 对象的属性,需将自定义视图控制器类附加到详情视图。操作步骤如下:
1. 创建一个名为 `AppDetailsViewController` 的新 Objective - C 类,并使其成为 `UIViewController` 的子类。取消勾选 “With XIB for user interface” 选项,因为该类用于控制故事板视图,无需 `.xib` 文件。
2. 返回故事板编辑器,选择 “App Details” 场景底部的视图控制器对象。
3. 打开 “Identity inspector”,将 “Class” 属性设置为 `AppDetailsViewController`。
### 1.2 创建出口和属性
接下来,为名称标签和描述文本视图创建出口,并添加一个属性来保存当前应用详情对象。
在 `AppDetailsViewController.h` 文件中添加以下代码:
```objc
//
// AppDetailsViewController.h
// About Us
//
#import <UIKit/UIKit.h>
#import "AppDetails.h"
@interface AppDetailsViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UITextView *descriptionTextView;
@property (strong, nonatomic) AppDetails *appDetails;
@end
```
在 `AppDetailsViewController.m` 文件的 `viewDidLoad` 方法中添加以下代码:
```objc
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.nameLabel.text = self.appDetails.name;
self.descriptionTextView.text = self.appDetails.description;
}
```
### 1.3 为表格视图场景创建自定义视图控制器
“App Details” 场景现已准备好接收 `AppDetails` 对象并填充其标签和文本视图。接下来,需要为表格视图场景创建另一个自定义视图控制器类。
操作步骤如下:
1. 创建一个新的 Objective - C 类,使其成为 `UITableViewController` 的子类,并命名为 `OurAppsTableViewController`。
2. 选择 “Our Apps” 场景的视图控制器对象,在 “Identity inspector” 中将其类设置为 `OurAppsTableViewController`。
3. 打开 `OurAppsTableViewController.m` 文件,删除或注释掉默认的表格视图数据源和委托方法:
- `numberOfSectionsInTableView:`
- `tableView:numberOfRowsInSection:`
- `tableView:cellForRowAtIndexPath:`
- `tableView:didSelectRowAtIndexPath:`
4. 重写 `prepareForSegue:sender:` 方法,以在触发三个转场之一时执行到 “App Details” 场景的过渡。在 `OurAppsTableViewController.m` 文件中添加以下代码:
```objc
//
// OurAppsTableViewController.m
// About Us
//
#import "OurAppsTableViewController.h"
#import "AppDetailsViewController.h"
#import "AppDetails.h"
@implementation OurAppsTableViewController
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSString *name;
NSString *description;
if ([segue.identifier isEqualToString:@"PushAppDetailsFromCell1"])
{
name = @"Awesome App";
description = @"Long description of the awesome app...";
}
else if ([segue.identifier isEqualToString:@"PushAppDetailsFromCell2"])
{
name = @"Even More Awesome App";
description = @"Long description of the even more awesome app...";
}
else if ([segue.identifier isEqualToString:@"PushAppDetailsFromCell3"])
{
name = @"The Most Awesome App Ever";
description = @"Long description of the most awesome app ever seen...";
}
else
{
return;
}
AppDetailsViewController *appDetailsViewController = segue.destinationViewController;
appDetailsViewController.appDetails =
[[AppDetails alloc] initWithName:name description:description];
}
// ...
@end
```
## 2. 使用单元格原型
### 2.1 从静态表格视图转换为动态表格视图
当前应用按预期工作,但如果要添加新应用,需要为每个新应用更新表格视图。可以使用单元格原型动态更新表格视图,而不是使用静态单元格实例。
操作步骤如下:
1. 返回 “Our Apps” 场景,删除三行,这也会移除三个关联的转场。
2. 选择表格视图,在 “Attributes inspector” 中将 “Content” 属性从 “Static Cells” 更改为 “Dynamic Prototypes”。
### 2.2 创建原型单元格
1. 从对象库中拖动一个新的表格视图单元格到表格视图上。可以像之前设计静态单元格一样设计该单元格,但添加一个 “Disclosure Indicator” 图标。
2. 创建一个名为 `AppTableViewCell` 的新 Objective - C 类,使其成为 `UITableViewCell` 的子类。
3. 选择原型单元格,在 “Identity inspector” 中将 “Class” 属性设置为 `AppTableViewCell`。
4. 在 “Attributes inspector” 中,将 “Identifier” 属性设置为 `AppCell`。
5. 在 `AppTableViewCell.h` 中为名称标签和描述标签创建出口,分别命名为 `nameLabel` 和 `descriptionLabel`。
6. 从原型单元格按住 Ctrl 键拖动一条线到 “App Details” 场景,选择 “push” 转场类型。选择新创建的转场,将其 “Identifier” 属性设置为 `PushAppDetails`。
### 2.3 编写动态显示表格视图内容的代码
在 `OurAppsTableViewController.h` 中导入原型单元格类:
```objc
#import "AppTableViewCell.h"
```
在 `OurAppsTableViewController.m` 中添加以下代码:
```objc
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Set the CellIdentifier that you set in the storyboard
static NSString *CellIdentifier = @"AppCell";
AppTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
switch (indexPath.row)
{
case 0:
cell.nameLabel.text = @"Awesome App";
cell.descriptionLabel.text = @"Long description of the awesome app...";
break;
case 1:
cell.nameLabel.text = @"Even More Awesome App";
cell.descriptionLabel.text = @"Long description of the even more awesome app...";
break;
case 2:
cell.nameLabel.text = @"The Most Awesome App Ever";
cell.descriptionLabel.text =
@"Long description of the most awesome app ever seen...";
break;
default:
cell.nameLabel.text = @"Unkown";
cell.descriptionLabel.text = @"Unknown";
break;
}
return cell;
}
```
简化 `prepareForSegue:sender:` 方法:
```objc
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"PushAppDetails"])
{
AppDetailsViewController *appDetailsViewController = segue.destinationViewController;
AppTableViewCell *cell = sender;
appDetailsViewController.appDetails =
[[AppDetails alloc] initWithName:cell.nameLabel.text
description:cell.descriptionLabel.text];
}
}
```
### 2.4 流程总结
以下是使用单元格原型的操作流程:
```mermaid
graph TD;
A[将表格视图从静态改为动态] --> B[删除现有行和转场];
B --> C[设置内容为动态原型];
C --> D[创建原型单元格];
D --> E[设计单元格并添加图标];
E --> F[创建自定义单元格类并关联];
F --> G[设置重用标识符];
G --> H[创建出口和转场];
H --> I[编写动态显示代码];
```
## 3. 错误处理
### 3.1 错误处理的重要性
应用程序处理错误的能力对用户体验至关重要。然而,错误处理在软件开发中常常被忽视,iOS 开发者也不例外。崩溃无解释或出现各种奇怪行为的应用并不少见。因此,需要创建一个默认错误处理程序来处理大多数错误。
### 3.2 设置错误处理框架
在 iOS 中,致命的、不可恢复的错误使用异常实现;对于潜在可恢复的错误,通常使用布尔返回值和包含错误详细信息的输出参数的传统方法。
以下是一个使用 Core Data 的 `NSManagedObjectContext:save:` 方法的示例:
```objc
NSError *error = nil;
if ([managedObjectContext save:&error] == NO)
{
NSLog(@"Unhandled error:\n%@, %@", error, [error userInfo]);
}
```
这种错误处理方式只是将错误详细信息输出到标准输出,然后继续执行,用户体验不佳。接下来构建一个小框架,以提供更好的用户体验。
操作步骤如下:
1. 创建一个新的单视图应用程序项目。
2. 创建一个名为 `ErrorHandler` 的新 `NSObject` 子类。
3. 在 `ErrorHandler.h` 文件中添加以下声明:
```objc
//
// ErrorHandler.h
// Recipe 1-10: Default Error Handl
```
0
0
复制全文
相关推荐










