Monotouch:UINavigationController,覆盖initWithRootViewController

时间:2011-04-20 18:11:42

标签: uinavigationcontroller controller xamarin.ios rootview

如何覆盖UINavigationController的构造函数以传入rootViewController?

我会在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;
}

提前谢谢你。问候。

P.S这段代码取自Change the root view controller

修改

感谢您的回复。我对之前的代码段感兴趣,因为它特别有趣。

@Geoff Norton:也许我永远不会使用你的解决方案,但无论如何我发现它很棒......

我的尝试是创建一种充当模板的UINavigationViewController。特别是,UINavigationController最初有一个loginView(它可能是一种rootviewcontroller)。然后登录时,我可以有两种类型的视图:主视图和辅助视图。前者与登录视图位于同一级别(它们可能是一种rootviewcontrollers)。后者被推到第一个之上。您可以浏览正常的UInavigationController堆栈或通过工具栏。工具栏仅加载主视图。

是否可以使用UINavigationController执行此操作?

再次感谢你。问候。

2 个答案:

答案 0 :(得分:4)

它可能但你不应该这样做。根据Apple的说法,UINavigationController是"not designed for subclassing".如果你坚持这样做:

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);
    }
}

接近这一点应该有用。

答案 1 :(得分:2)

像Geoff Norton所指出的那样,你不应该继承UINavigationController。

我一直坚持这样做几次,只是为了发现每隔一段时间就会出现一些没有逻辑解释的错误。当你谷歌那些,答案总是“你应该没有子类UINavigationController”。