【问题标题】:Xamarin iOS - Load Storyboard Reference ProgramaticallyXamarin iOS - 以编程方式加载情节提要参考
【发布时间】:2017-08-11 18:48:12
【问题描述】:

我有 2 个故事板:Activities.storyboardContacts.storyboard

Contacts.storyboard 我有一个 ViewController:ContactDetails

Activities.storyboard 上,我需要在Contacts.storyboard 中引用ContactDetails

我在Activities.storyboard 上创建了一个Storyboard Reference 并引用了ContactDetails

我尝试以编程方式加载此视图控制器

var viewController = Storyboard.InstantiateViewController(nameof(ContactDetails));
NavigationController.PushViewController(viewController, true);

但我没有工作以编程方式加载为普通视图控制器

Foundation.MonoTouchException:抛出 Objective-C 异常。姓名: NSInvalidArgumentException 原因:Storyboard () 不包含带有标识符的视图控制器 '联系方式'

我知道它是这样工作的:

var storyboard = UIStoryboard.FromName(nameof(Contact), null);
var viewController = storyboard.InstantiateViewController(nameof(ContactDetails));
NavigationController.PushViewController(viewController, true);

但是我想使用参考视图控制器,可以吗?

【问题讨论】:

  • 我相当肯定,在尝试从应用程序故事板实例化时,使用名为“故事板 ID”的 UIViewController 的属性更为常见,此故事板 ID 也可以用作“恢复标识符”。

标签: ios xamarin xamarin.ios storyboard-reference


【解决方案1】:

如果您使用 Storyboard ID,它也可以用作“恢复标识符”,并允许您从 Storyboard 实例化。我建议使用这种方法,它往往是实现您想要做的最简单的方法。

还值得注意的是,您必须将实例化的 UIViewController 转换为它的类型(至少我发现如果我想传递变量等,它会让生活更轻松。)

ContactDetails viewController = Storyboard.InstantiateViewController(nameof(ContactDetails)) as ContactDetails;

ContactDetails viewController = Storyboard.InstantiateViewController("ContactDetails") as ContactDetails;

还值得注意的是,UIViewController 的 Xamarin iOS 'Storyboard' 属性会自动确定 Storyboard 引用,并且值得检查它是否确实为您带来了指向 'Contact' 故事板的指针(因为多个故事板当然可以在iOS 开发应由您选择。)

【讨论】:

  • 我觉得我表达的不对。我有 2 个故事板,我需要将一个 ViewController 从一个引用到另一个。请看我的版本。我试过 Cast,但没有用。
  • 好的,所以向我解释一下使用上面所说的代码有什么问题。对我来说似乎很好,您创建对要访问的情节提要的引用,然后实例化视图控制器。我觉得好像我错过了为什么你不能这样做?
【解决方案2】:

显然,加载 Storyboard Reference 的唯一方法是使用 Segue

以编程方式唯一的方法是实例化Storyboard,然后实例化ViewController

像这样:

var storyboard = UIStoryboard.FromName(nameof(Contact), null);
var viewController = storyboard.InstantiateViewController(nameof(ContactDetails));
NavigationController.PushViewController(viewController, true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多