0

rootViewController を渡すために UINavigationController のコンストラクターをオーバーライドするにはどうすればよいですか?

Objective-C では、次のようなメソッドがあります。

-(id)initWithRootViewController:(UIViewController*)rootViewController
{
    UIViewController *fakeController = [[[UIViewController alloc] init] autorelease];
    if (self = [super initWithRootViewController:fakeController]) {

      self.fakeRootViewController = fakeController;

      rootViewController.navigationItem.hidesBackButton = YES;

      [self pushViewController:rootViewController animated:NO];
    } 
    return self;
}

前もって感謝します。よろしく。

PS このコード スニペットは、ルート ビュー コントローラーの変更から取得したものです。

編集:

返信ありがとうございます。特に興味深いので、前のコード スニペットに興味がありました。

@Geoff Norton: たぶん私はあなたのソリューションを決して使用しないでしょうが、とにかく素晴らしいと思います...

私の試みは、テンプレートとして機能する一種の UINavigationViewController を作成することです。特に、UINavigationController には最初に loginView があります (一種の rootviewcontroller である可能性があります)。ログインすると、メイン ビューとセカンダリ ビューの 2 種類のビューが表示されます。前者は、ログイン ビューの同じレベルにあります (一種の rootviewcontrollers である可能性があります)。後者は最初のものの上に押し出されます。通常の UInavigationController スタックを介して、またはツールバーを使用して移動できます。ツールバーはメイン ビューのみをロードします。

UINavigationController でこれを行うことは可能ですか?

ありがとうございました。よろしく。

4

2 に答える 2

4

可能ですが、やるべきではありません。Apple によると、UINavigationController は「サブクラス化用に設計されていません」。 これを行うことを主張する場合:

public YourNavController : UINavigationController {
    [Export ("initWithRootViewController:")]
    public YourNavController (UIViewController vc) {
      UIViewController fc = new UIViewController ();
      Handle = Messaging.intptr_objc_msgSend_intptr (this.Handle, Selector.GetHandle ("initWithRootViewController:"), fc.Handle);
      FakeRootViewController = fc;
      vc.NavigationItem.HidesBackButton = true;
      PushViewController (vc, false);
    }
}

それに近いものが機能するはずです。

于 2011-04-20T18:21:17.343 に答える
2

Geoff Nortonが指摘したように、UINavigationControllerをサブクラス化することは想定されていません。

私はこれを自分で数回行うことを主張しましたが、論理的な説明がないバグが時々発生することを知りました。あなたがそれらをグーグルで検索するとき、答えは常に「あなたはUINavigationControllerをサブクラス化するべきではなかった」です。

于 2011-04-21T13:44:58.550 に答える