概要:
何が機能するかから始めるために、UITableView
InterfaceBuilderを使用してXcodeで生成されたビューに配置されたを持っています。ビューのファイル所有者は、Xcodeで生成されたのサブクラスに設定されUIViewController
ます。このサブクラスに、との実用的な実装numberOfSectionsInTableView: tableView:numberOfRowsInSection:
とtableView:cellForRowAtIndexPath:
テーブルビューdataSource
を追加delegate
し、InterfaceBuilderのファイル所有者を介してこのクラスに接続しています。
上記の構成は問題なく機能します。dataSource
この問題は、このテーブルビューと実装を別のクラスに移動したい場合に発生します。delegate
おそらく、テーブルビュー以外にビューに他のコントロールがあり、テーブルビュー関連のコードをそのクラスに移動したいためです。独自のクラス。これを達成するために、私は次のことを試みます:
UITableViewController
Xcodeでの新しいサブクラスを作成します- の既知の適切な実装を
numberOfSectionsInTableView:
新しいサブクラスにtableView:numberOfRowsInSection:
移動しますtableView:cellForRowAtIndexPath:
- をInterfaceBuilderの既存のXIB
UITableViewController
の最上位に ドラッグし、このために自動的に作成された/を削除してから、のクラスを新しいサブクラスに一致するように設定しますUIView
UITableView
UITableViewController
UITableViewController
UITableView
以前に機能していたの既存のdataSource
接続を削除し、delegate
それらを新しい接続に接続しますUITableViewController
完了したとき、私は動作していませんUITableView
。私は、一見ランダムに発生する可能性のある3つの結果のうちの1つになります。
- ロードすると、それを認識しないオブジェクト
UITableView
に送信していることを示すランタイムエラーが発生しますtableView:cellForRowAtIndexPath:
- ロードされると、プロジェクトは
UITableView
エラーなしでデバッガーに侵入します - エラーはありませんが、表示され
UITableView
ません
デバッグを行い、この問題を再現するためだけに基本的なプロジェクトを作成したところ、通常、上記の3番目のオプションが表示されます(エラーはありませんが、テーブルビューは表示されません)。NSLog呼び出しをいくつか追加したところ、numberOfSectionsInTableView:
とnumberOfRowsInSection:
は両方とも呼び出されていますが、そうでcellForRowAtIndexPath:
はないことがわかりました。私は本当に単純なものが欠けていると確信しており、私よりも経験豊富な人にとって答えが明白になることを望んでいました。これが簡単な答えではない場合は、コードまたはサンプルプロジェクトで更新していただければ幸いです。御時間ありがとうございます!
再現するための完全な手順:
- Xcodeで新しいiPhoneOS、ビューベースのアプリケーションを作成し、それを呼び出します
TableTest
TableTestViewController.xib
Interface Builderで開き、提供されたビューサーフェスにをドラッグしますUITableView
。UITableView
'sdataSource
とdelegate
-outletsをファイルの所有者に接続します。ファイルの所有者はすでに-classを表しているはずですTableTestViewController
。変更を保存します- Xcodeに戻り、次のコードをに追加します
TableTestViewController.m:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
NSLog(@"Returning num sections");
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSLog(@"Returning num rows");
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Trying to return cell");
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
cell.text = @"Hello";
NSLog(@"Returning cell");
return cell;
}
Build and Goを実行すると、単語
Hello
がUITableView
この
UITableView
ロジックを別のクラスに移動するために、最初にXcodeで新しいファイルを作成し、UITableViewController
サブクラスを選択してクラスを呼び出します。TableTestTableViewController
- 上記のコードスニペットをから削除して
TableTestViewController.m
に配置しTableTestTableViewController.m
、これら3つのメソッドのデフォルトの実装を私たちのものに置き換えます。 - 同じファイル内のInterfaceBuilderに戻り、をメインIBウィンドウに
TableTestViewController.xib
ドラッグして、自動的に付属していた新しいオブジェクトを削除します。UITableViewController
UITableView
- この新規のクラスをに設定
UITableViewController
しますTableTestTableViewController
- 以前に機能していた既存のバインディングから
dataSource
とバインディングを削除し、同じ2つのバインディングを作成した新しいバインディングに再接続します。delegate
UITableView
TableTestTableViewController
- 変更を保存し、ビルドして実行します。取得した結果が得られた場合は、
UITableView
正しく機能しなくなったことに注意してください。
解決策:iPhone開発者フォーラム
からのトラブルシューティングと支援を受けて、解決策を文書化しました!プロジェクトのメインサブクラスには、インスタンスUIViewController
を指すアウトレットが必要です。UITableViewController
これを実現するには、プライマリビューのヘッダー(TableTestViewController.h
)に以下を追加するだけです。
#import "TableTestTableViewController.h"
と
IBOutlet TableTestTableViewController *myTableViewController;
次に、Interface Builderで、ファイルの所有者からの新しいアウトレットをTableTestTableViewController
メインIBウィンドウに接続します。XIBのUI部分を変更する必要はありません。ユーザーコードが直接使用していなくても、このコンセントを設置するだけで、問題は完全に解決されます。助けてくれた人々に感謝し、解決策を見つけるためにiPhone開発者フォーラムのBaldEagleにクレジットを送ります。