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

当使用新的Xamarin.iOS设计器时,它将自动创建您的控制器,视图等,因此您的C#代码可以在设计图面上运行并实际呈现(而不必等到运行时).

因此,如果您有一个控制器,它是构造函数,则将调用ViewDidLoad.

所以说我有一个像这样的控制器:

class MyController
{
    readonly ISomeService service;

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

显然,在设计时,IoC容器将完全为空并引发异常.

Xamarin.iOS设计器是否可以解决此问题?也许#if!DESIGN_TIME或类似的性质?还是有办法让我的IoC容器在设计时返回所有对象的模拟实例?

解决方法:

当前推荐的方法是让您的类实现IComponent接口.有关更多信息,请参见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.从情节提要板进行初始化的首选位置是AwakeFromNib方法.我更新了代码示例以反映这一点.

上一篇:c#-已引发MonoTouch.Foundation.MonoTouchException引发了Objective-C异常.名称:NSInternalInconsistencyException


下一篇:CodeGo.net>如何在Xamarin中测试共享代码