11

UIViewControllerのparentViewControllerプロパティは読み取り専用ですが、カスタムビューコントローラをネストしてこのプロパティを使用します。UIViewControllerでparentViewControllerを設定するにはどうすればよいですか?

しかし、それは読んでいるので、私はこのプロパティを設定する他の方法が見つかりませんでした、私の質問はです:どのようにを行う私はそれを設定しましたか?

明らかに、UINavigationControllerは何らかの形で-pushViewControllerにプロパティを設定できるので、-presentModalViewControllerも可能である必要があります。

私は自分のUIViewControllerプロパティを追加することができますが、parentViewControllerは原則として正しいプロパティであると確信しています。

+0

私はこのスレッドのすべての回答を投票した人が理由を挙げることができると思います:) – willcodejavaforfood

+0

私はそうではありませんでしたが、私はプライベートAPIを使用することに同意していないと思うし、プライベートAPI SO上で共通しています。たぶん彼らはAppleの凶悪犯だ。 –

答えて

1

しかし、それは読んでいるので、このプロパティを設定する方法は他にありませんでした。質問はどうすれば設定できますか?

readonlyの場合は、compiler errorを取得しないとドット表記を使用できません。

ただし、を使用して、カスタムmodifyParentViewControllerメソッドをUIViewControllerクラスに追加することができます。

プロパティが読み込み専用であっても、変数自体が@protectedでない場合は変更可能である可能性があります。 @protectedの場合、View Controllerをサブクラス化すると、変数を変更するオプションが表示される場合があります。

+0

これをやっているのは幾分汚いですが、私がparentViewControllerの使用を主張するのであれば、これは唯一可能な方法です。
私はカスタムUIViewControllerプロパティを使用します。 – mrueg

0

parentViewControllerはNavigationViewControllerの目的であり、モーダルビューコントローラを提示するため、pushViewControllerまたはpresentModalViewControllerメソッドなしでプロパティを設定する方法はありません。 parentViewControllerはreadonlyプロパティで、UIViewControllerクラスとUINavigationControllerクラスでのみ読み取ることができます。これらのサブクラスはプロパティを設定するアクセス権を持ちません。

2

私は、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]; 
} 

私のテーブルビューコントローラのすべてが今adoptedTableViewControllersです。親が必要な主な理由は、ビューコントローラをナビゲーションスタックに押し込むことができるため、ナビゲーションコントローラゲッターによって透過的に処理されるためです。

parentViewControllerが読み込み専用ではなく、_parentViewControllerを使用すると、そのプロパティだけでなくViewController階層に多くの情報があることがわかりました。私は、Appleが大衆のために十分にクリーンアップしていないという関係の中で、たくさんのつながりと責任があると思う。たとえば、私が修正できなかったナビゲーション階層を上に移動すると、奇妙な選択解除動作に気がつきました。おそらくUINavigationコントローラーは、トップコントローラーのクラスを反映し、異なる動作をしますか?

要するに、これは実際には読み取り専用であり、クリーンまたは簡単な回避策はありません。あなたはちょうどその周りに設計する必要があります。

0

setParentViewController:メソッドを呼び出すように見えます。

[childViewController setParentViewController:self]; 

しかし、これでもコンパイラ警告が生成されます。どちらが、IMO、それをしないことを意味する(私は代わりにサブクラス化した)。

11

ソリューションは次のようになります。これは、リンカの問題が起こらない

- (void)setParentController:(UIViewController*)parent{ 
[self setValue:parent forKey:@"_parentViewController"]; 
    } 

PS:このメソッドは、プライベートAPIに存在するため、メソッド名として「setParentViewController」を使用しないでください。また、Appleは言う: 「あなたのアプリケーションに含まれる非パブリックAPIはsetParentViewController:です。

場合上記のAPIと同じ名前のメソッドをソースコードに定義しておけば、メソッドの名前を変更して、AppleのプライベートAPIと衝突しないようにすることをお勧めします。

Please次のアップデートでこの問題を解決してください... "

+2

これはApp Storeの拒否を引き起こしませんか?これはモーダルプレゼンテーションの問題を解決しますが、恐ろしいことです。 –

9

私はこの質問がiOS 5の前に尋ねられたことを認識していますが、参照のためにUIViewControllersをネストしたいときはaddChildViewControllerを使うべきです。これにより、parentViewControllerプロパティも自動的に設定されます。

- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0); 

「カスタムコンテンツビューコントローラの作成」については、Appleで読むことができます。

+1

これは私のために働く、子View ControllerのparentViewControllerプロパティを設定します。なぜそれが受け入れられた答えではないか分かりません。 – KyleStew

関連する問題