如何在 AppDelegate.cs 中使用带有插座的单独 XIB 的 UIViewController?出口始终为 NULL

Posted

技术标签:

【中文标题】如何在 AppDelegate.cs 中使用带有插座的单独 XIB 的 UIViewController?出口始终为 NULL【英文标题】:How to use UIViewController of a separate XIB with outlet in AppDelegate.cs? Outlet is always NULL 【发布时间】:2011-08-28 20:43:45 【问题描述】:

这里很奇怪。我想我以前做过,但它似乎不再起作用。 环境现在是:Lion、MT 4.1、MD 2.6 RC、Xcode 3 的 Interface Builder。

我有一个通用应用程序(来自 MonoDevelop 的模板)。 我将其更改为拥有一个 AppDelegateBase 类,iPhone 和 iPad 的应用程序委托都从该类继承。 有一个 MasterController.xib 文件包含一个UITabBarController。 在 IB 中,我将此 XIB 的 文件所有者 设置为 AppDelegateBase。 我添加了一个UITabBarController插座并连接到相应的控制器。

在 MasterController.xib.designer.cs 我可以看到连接在那里。这就是 MasterController.xib.designer.cs 的样子:

// 基本类型可能应该是 MonoTouch.UIKit.UIViewController 或子类 [MonoTouch.Foundation.Register("AppDelegateBase")] 公共部分类 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始终为 NULL。这里有什么问题? 与早期项目的唯一区别是我有一个额外的 XIB,其中包含我将在 iPhone 和 iPad 中使用的控制器,因此我不想在 iPhone 和 iPad 的 XIB 中重复。

我必须先加载 MasterController.xib 才能对其进行操作吗?如何?困惑。

【问题讨论】:

MasterController.xib是如何加载的? 完全没有,这就是我认为的问题所在。我想我必须使用一些 LoadNib() - 但是如何? 【参考方案1】:

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

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

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

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

如果要通过代码加载XIB,可以考虑如下sn-p:

NSBundle.MainBundle.LoadNib ("MasterController", this, null);

【讨论】:

澄清一下:这个名字可能会产生误导。 “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 中添加视图控制器这一事实并不意味着您将在运行时拥有两个控制器。这就是为什么您必须将它们的 NIB 名称设置为包含实际控制器的 XIB 的名称。这些只会作为您的标签栏控制器的链接。 我明白这一点。但是,如果有一天我决定不再拥有一个 UITabBarController,而是说一个 UINavigationController,我将不得不更改 3 个 XIB(2 个占位符,一个真实的东西),而不是只更改真实的控制器。我不敢相信我必须添加一个“假人”。如果我不使用 IB,我会在代码中使用我的 UITabBarController,我可以将新的 MyUITabBarController() 添加到 iPad 和 iPhone,并且仍然可以在 IB 中进行布局......你明白我的意思吗?

以上是关于如何在 AppDelegate.cs 中使用带有插座的单独 XIB 的 UIViewController?出口始终为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

应用程序委托问题,MonoTouch

ipa运行时如何禁用屏幕关闭

带有命名插座子组件的Angular 5问题

当应用程序在后台并接收推送通知点击应用程序崩溃时

如何在 Power BI 中使用 Python 脚本实现插补?

如何利用Zotero在Word中插文献