我是 Objective-C 的新手,所以请耐心等待。我从 Xcode4 中的 Universal App 模板开始构建我的应用程序。有一个约定,模板让您开始使用我试图坚持的约定。对于每个 View Controller,每个设备类型都有一个主文件和一个子类。例如:
Project/
ExampleViewController.(h|m)
- iPhone/
- ExampleViewController_iPhone.(h|m|xib)
- iPad/
- ExampleViewController_iPad.(h|m|xib)
在大多数情况下,这非常方便。大多数逻辑都在超类中,子类负责任何特定于设备的实现。
这是我不明白的部分。有时我的代码在每个子类中执行相同的操作只是因为我需要为每个设备加载不同的 xib。例如:
ExampleViewController_iPhone
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Content *selectedContent = (Content *)[[self fetchedResultsController] objectAtIndexPath:indexPath];
ContentDetailViewController_iPhone *detailViewController = [[ContentDetailViewController_iPhone alloc] init];
detailViewController.content = selectedContent;
detailViewController.managedObjectContext = self.managedObjectContext;
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
}
ExampleViewController_iPad
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Content *selectedContent = (Content *)[[self fetchedResultsController] objectAtIndexPath:indexPath];
ContentDetailViewController_iPad *detailViewController = [[ContentDetailViewController_iPad alloc] init];
detailViewController.content = selectedContent;
detailViewController.managedObjectContext = self.managedObjectContext;
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
}
...请注意,在第二种情况下,唯一不同的是它正在加载_iPad
View Controller 的版本。这是必要的,因为iPad
和iPhone
视图控制器附加到单独的设备特定 nib。
这样做的“正确”模式是什么?
更新
我找到了这个关于使用设备修饰符加载单独的 xib 的答案,这似乎在我不需要为一个设备提供特定子类的情况下有所帮助,但如果我需要实例化一个特定的_iPhone
或_iPad
实例,它仍然无济于事用于设备特定功能的视图控制器。