ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-21 08:07:19  阅读:332  来源: 互联网

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

标签:xamarin,xamarin-ios,ios,c
来源: https://codeday.me/bug/20191121/2050486.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有