c# - 将代码标记为在设计时不运行

标签 c# ios xamarin.ios xamarin

当使用新的 Xamarin.iOS 设计器时,它会自动创建您的 Controller 、 View 等,以便您的 C# 代码运行并实际呈现在设计界面上(而不必等到运行时)。

因此,如果您有一个 Controller ,它的构造函数和 ViewDidLoad 将被调用。

假设我有一个这样的 Controller :

class MyController
{
    readonly ISomeService service;

    public MyController(IntPtr handle) : base(handle)
    {
        service = MyIoCContainer.Get<ISomeService>();
    }
}

显然在设计时,IoC 容器将完全为空并抛出异常。

有没有办法用 Xamarin.iOS 设计器解决这个问题?也许 #if !DESIGN_TIME 或类似的东西?或者有没有办法让我的 IoC 容器在设计时返回所有对象的模拟实例?

最佳答案

目前推荐的方法是让您的类实现 IComponent 接口(interface)。参见 this doc想要查询更多的信息。所以你的 MyController 类可能看起来像这样:

[Register ("MyController")]
class MyController : UIViewController, IComponent
{
    #region IComponent implementation

    public ISite Site { get; set; }
    public event EventHandler Disposed;

    #endregion

    readonly ISomeService service;

    public MyController(IntPtr handle) : base(handle)
    {
    }

    public override void AwakeFromNib ()
    {
        if (Site == null || !Site.DesignMode)
            service = MyIoCContainer.Get<ISomeService>();
    }
}

请注意,Site 在构造函数中始终为 null。从 Storyboard进行初始化的首选位置是 AwakeFromNib 方法。我更新了代码示例以反射(reflect)这一点。

关于c# - 将代码标记为在设计时不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25827354/

相关文章:

.net - Azure 通知中心 : How to send localized, 从 .net 后端向个人用户推送独立于平台的通知?

c# - IConfiguration.Bind() 如何在参数中没有 'out' 或 'ref' 的 .NET Core 中工作?

c# - 在 Asp.Net 中使用电子邮件发送忘记密码

ios - 在没有 UIScrollView 的情况下使 UIView 可滚动

iphone - 通过monotouch将iPhone应用程序部署到单个电话的最低成本是多少?

ios - 在 iOS 上嵌入 Mono

c# - 从 OpenXML 中的 SlidePart 检索 SlideSize

c# - 如何将实例 ninject 传递到构造函数中

iphone - IOS - 通过使用 ARC 的循环创建新的对象实例

ios - 如何让我的 iOS 应用程序连续循环播放声音列表?