UIViewController のカテゴリを作成して Alex の提案購入を試みましたが、シミュレーターでは機能しましたが、電話では機能しませんでした。カテゴリーはこちら
@interface UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent;
@end
@implementation UIViewController (parentSetter)
-(void)setParentUIViewController:(UIViewController*)parent
{
_parentViewController = parent;
}
@end
コンパイルして正常に動作しますが、アンダースコアメンバーが少しずれていることに注意してください。これが、3.0 SDK に対してコンパイルするときにリンカー エラーを引き起こす原因です。
2 つのサブビューを持つコンテナー ビューがあり、テーブルはその 1 つです。テーブルには、特にナビゲーション バーと対話できるように親が必要です。
代わりに、このソリューションを使用します。
@interface AdoptedTableViewController : UITableViewController {
UIViewController* surrogateParent;
}
-(UINavigationController*)navigationController;
@property (nonatomic, assign) IBOutlet UIViewController *surrogateParent;
@end
@implementation AdoptedTableViewController
@synthesize surrogateParent;
-(UINavigationController*)navigationController
{
if( [super navigationController] )//self.navigationController )
{
return [super navigationController];
}
else
{
return surrogateParent.navigationController;
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
すべてのテーブル ビュー コントローラーが採用され、TableViewControllers になりました。親が必要な主な理由は、View Controller をナビゲーション スタックにプッシュできるようにするためです。これは、Navigation Controller ゲッターによって透過的に処理されます。
parentViewController が読み取り専用でなければいいのですが、_parentViewController をいじってみると、ViewController 階層にはそのプロパティだけではないことがわかりました。その関係には、Apple が大衆のために十分に片付けていない多くの結合と責任があるのではないかと思います。たとえば、ナビゲーション階層を上に移動すると、修正できない奇妙な選択解除動作に気付きました。おそらく、UINavigation コントローラーはトップ コントローラーのクラスを反映し、異なる動作をするのでしょうか?
要するに、これは実際には読み取り専用であり、明確で単純な回避策はありません。あなたはそれを中心に設計する必要があります。