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方法.我更新了代码示例以反映这一点.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...