14

UIViewController の parentViewController プロパティは読み取り専用ですが、カスタム ビュー コントローラをネストしており、このプロパティを使用したいと考えています。

ただし、読み取り専用であり、このプロパティを設定する他の方法が見つからなかったため、私の質問は次のとおりです。どのように設定しますか?

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

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

4

6 に答える 6

11

解決策は次のとおりです。

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

リンカーに問題はありません。

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

ソース コードで上記の API と同じ名前のメソッドを定義している場合は、Apple のプライベート API と競合しないようにメソッド名を変更して、今後の提出でアプリケーションにフラグが立てられないようにすることをお勧めします。

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

于 2010-05-10T12:44:07.800 に答える
10

この質問が iOS 5 より前に出されたことは承知していますが、参考までに、UIViewController をネストする場合は addChildViewController を使用する必要があります。これにより、parentViewController プロパティも自動的に設定されます。

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

Appleの「Creating Custom Content View Controllers」について詳しく読むことができます。

于 2013-02-20T22:02:43.693 に答える
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];
}

すべてのテーブル ビュー コントローラーが採用され、TableViewControllers になりました。親が必要な主な理由は、View Controller をナビゲーション スタックにプッシュできるようにするためです。これは、Navigation Controller ゲッターによって透過的に処理されます。

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

要するに、これは実際には読み取り専用であり、明確で単純な回避策はありません。あなたはそれを中心に設計する必要があります。

于 2010-01-07T09:25:25.993 に答える
0

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

于 2009-09-07T23:44:19.210 に答える
0

ただし、読み取り専用であり、このプロパティを設定する他の方法が見つからなかったため、私の質問は次のとおりです。どのように設定しますか?

そうである場合、コンパイラ エラーが発生readonlyせずにドット表記を使用することはできません。

ただし、カテゴリmodifyParentViewControllerを使用してカスタムメソッドをUIViewControllerクラスに追加できる場合があります。

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

于 2009-09-07T22:12:07.210 に答える