私はobjective-Cが初めてなので、ご容赦ください。Xcode4 の Universal App テンプレートから始めて、アプリケーションを構築しました。私が固執しようとしたテンプレートがあなたを始めるという慣習があります. ビュー コントローラーごとに、デバイスの種類ごとにメイン ファイルとサブクラスがあります。例えば:
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
... 2 番目のインスタンスでは、View Controller のバージョンをロードしていることだけが異なることに注意してください。これは、ビュー コントローラiPad
とiPhone
ビュー コントローラが別々のデバイス固有のペン先に接続されているために必要です。
これを行うための「正しい」パターンは何ですか?
アップデート
デバイス修飾子を使用して個別のxibをロードすることに関するこの回答を見つけました。これは、1つのデバイスに特定のサブクラスが必要ない場合に役立つようですが、特定の_iPhone
または_iPad
インスタンスをインスタンス化する必要がある場合はそれでも役に立ちませんデバイス固有の機能用のビュー コントローラー。