Xamarin.ios 如何在AppDelegate.cs中使用带有插座的单独XIB的UIViewController?出口总是空的

Xamarin.ios 如何在AppDelegate.cs中使用带有插座的单独XIB的UIViewController?出口总是空的,xamarin.ios,Xamarin.ios,奇怪的事。我想我以前做过,但似乎不再管用了。 现在的环境是:Lion、MT4.1、MD2.6RC、Xcode 3的接口生成器 我有一个通用应用程序(来自MonoDevelop的模板) 我把它改成了一个AppDelegateBase类,iPhone和iPad的应用程序委托都从这个类继承 有一个MasterController.xib文件包含UITabBarController 在IB中,我将该XIB的文件所有者设置为AppDelegateBase 我添加了一个UITabBarController

奇怪的事。我想我以前做过,但似乎不再管用了。 现在的环境是:Lion、MT4.1、MD2.6RC、Xcode 3的接口生成器

  • 我有一个通用应用程序(来自MonoDevelop的模板)
  • 我把它改成了一个
    AppDelegateBase
    类,iPhone和iPad的应用程序委托都从这个类继承
  • 有一个MasterController.xib文件包含
    UITabBarController
  • 在IB中,我将该XIB的文件所有者设置为
    AppDelegateBase
  • 我添加了一个
    UITabBarController
    插座,并将其连接到相应的控制器
  • 在MasterController.xib.designer.cs中,我可以看到连接在那里。这就是MasterController.xib.designer.cs的外观:

    //基本类型可能应该是MonoTouch.UIKit.UIViewController或子类 [基础]登记(“AppDealTeaBase]”) 公共部分类AppDelegateBase{

        private MonoTouch.UIKit.UITabBarController __mt_oTabBarController;
        [MonoTouch.Foundation.Connect("oTabBarController")]
        private MonoTouch.UIKit.UITabBarController oTabBarController {
            get {
                this.__mt_oTabBarController = ((MonoTouch.UIKit.UITabBarController)(this.GetNativeField("oTabBarController")));
                return this.__mt_oTabBarController;
            }
            set {
                this.__mt_oTabBarController = value;
                this.SetNativeField("oTabBarController", value);
            }
        }
    }
    
但是在我的AppDelegatebase.cs中,
this.oTabBarController
总是空的。这里怎么了? 与早期项目唯一不同的是,我有一个额外的XIB,其中包含一个控制器,我将在iPhone和iPad中使用,因此不想在iPhone和iPad的XIB中重复


在对MasterController.xib执行操作之前,是否必须对其进行laod操作?如何操作?令人困惑。

无需将文件的所有者设置为AppDelegateBase。请将其设置为要使用的控制器(在本例中为UITabBarController)。在MainWindowIPad.xib和MainWindowIPhone.xib中,添加一个UITabBarController,将其连接到每个窗口中AppDelegate中的一个插座,并将其NIB名称字段设置为MasterController

到目前为止,您所做的是正确的。但是您还需要加载包含要显示的控制器的XIB

由于它是第一个加载的MasterController.xib,因此在MonoDevelop的项目设置中,在iPhone应用程序下,将其设置为应用程序的主界面文件。“主界面文件”和“iPad界面文件”

不要忘记将控制器的视图添加到窗口中。您可以通过代码实例化该视图,或者只需将其添加到XIB并将其连接到AppDelegateBase对象中的出口

如果要通过代码加载XIB,请考虑下面的代码段:


MasterController.xib是如何加载的?一点也不,我想这就是问题所在。我想我必须使用一些LoadNib()-但是如何加载?只是想澄清一下:名称可能有误导性。“MasterController”并不意味着它是主XIB。有MainWindowIPad.XIB和MainWindowIPhone.XIB。这些都是在Mono Develop中为主界面文件设置的。MasterController.XIB包含应该在两个设备之间共享的控制器。我尝试了LoadNib()但在AppDelegate.cs中执行时失败。我必须在哪里调用它?在您的示例中“this”是什么?但这不是我想要的。如果我必须在两个XIB(iPhone和iPad)中添加一个UITabBarController,为什么我会有第三个XIB和第三个UITabBarController?我想要的是:从单独的XIB中获取UITabBarController,然后(在代码中)将其添加为iPhone RootViewController或iPad拆分视图主控制器。因此,我希望在我的基本AppDelegate中有一个UITabBarController插座。该插座应从单独的XIB连接到控制器。您将在两个不同的XIB中添加视图控制器的事实并不意味着在runtim中有两个控制器e、 这就是为什么您必须将其NIB名称设置为包含实际控制器的XIB的名称。这些名称将仅用作指向选项卡栏控制器的链接。我理解这一点。但如果有一天我决定不再使用UITabBarController,而使用UINavigationController,我将不得不更改3个XIB(2个占位符,一个真实的东西)我不能相信我必须添加一个“虚拟”控制器。如果我不使用IB,我会用我的UITabBarController编写代码,我可以在iPad和iPhone上添加一个新的MyUITabBarController(),布局仍然可以用IB制作。你明白我的意思吗?
NSBundle.MainBundle.LoadNib ("MasterController", this, null);