如何加载存在于 Xamarin.iOS 中的共享库项目中的第二个 Storyboard
Posted
技术标签:
【中文标题】如何加载存在于 Xamarin.iOS 中的共享库项目中的第二个 Storyboard【英文标题】:How to load a second Storyboard that exist in a shared library project in Xamarin.iOS 【发布时间】:2017-05-05 13:18:56 【问题描述】:我有一个包含 2 个项目的 Xamarin.ios 解决方案。第一个是主 iOS 应用项目,第二个是 Xamarin.iOS 库项目。我在每个项目中都有一个故事板,在 iOS 项目中,故事板很简单,只有一个视图控制器,它的工作是初始化视图控制器并从库项目中加载故事板。
这背后的原因是我们希望为特定客户创建一个应用品牌的副本。所以主应用逻辑将在库项目中,主 iOS 应用包含客户端品牌应用的所有样式。
我在这方面取得了一定的成功。我可以通过在第一个故事板的 ViewDidAppear
方法中调用它来加载第二个故事板。
var sb = UIStoryboard.FromName("Storyboard", null);
var ctlr = sb.InstantiateInitialViewController();
this.PresentViewController(ctlr, true, null);
当我尝试在第二个故事板的UIViewController
中添加任何内容时,问题就出现了。我收到以下错误:
Objective-C exception thrown. Name: NSUnknownKeyException Reason:
[<UIViewController 0x166d5120> setValue:forUndefinedKey:]: this class
is not key value coding-compliant for the key SecondText.
SecondText
是第二个故事板上UITextField
的出口名称。
这可能不是实现我想要的最好的方法,但我仍然很困惑为什么当一个插座被添加到视图控制器时这个方法不起作用。
当第二个故事板位于主 iOS 应用项目上时,不会发生此问题。
如果有人能对此有所了解,将不胜感激。如果你想看看,我已经在这里上传了我的测试项目。
https://github.com/kckc/testShareStoryboard
最后一点是,我注意到 ViewDidLoad
方法在库项目中时没有在第二个故事板的视图控制器上触发,这可能是它的原因吗?
【问题讨论】:
【参考方案1】:而不是使用:
var ctlr = sb.InstantiateInitialViewController();
尝试按名称实例化第二个视图控制器:
UIStoryboard sb = UIStoryboard.FromName("Storyboard", null);
nameofsecondviewcontroller ctlr = sb.InstantiateViewController("nameofsecondviewcontroller") as nameofsecondviewcontroller;
PresentViewController(ctlr, true, null);
这应该使用第二个viewcontroller的设计器来初始化View的控件。
【讨论】:
这对我有用,非常感谢!不敢相信就这么简单……这两种方法有什么区别?这是否意味着Initial View Controller
设置仅与主故事板相关?
好的......更正,这对我来说并不完全有效。当第二个故事板中的视图控制器是普通的UIViewController
时它可以工作,但当它是UINavigationController
时则不行...当我加载导航控制器并且根视图控制器有一个出口时会发生同样的错误
我现在可以看到Unknown class SecondViewController in Interface Builder file.
错误。
好吧,这只是因为它不是为实例化导航控制器而设计的,这样做的方式略有不同,以后有机会我会为您整理一些代码。
嗨@Digitalsa1nt,感谢您回来。从那以后,我发现由于在主应用程序项目中缺少对这些类的引用,更多地与类没有被加载到程序集中有关......我在this link 中提出了一些建议来解决它。我认为视图控制器的初始化方式很好。以上是关于如何加载存在于 Xamarin.iOS 中的共享库项目中的第二个 Storyboard的主要内容,如果未能解决你的问题,请参考以下文章