MonoTouch [Outlet]的范围

时间:2012-08-24 13:34:06

标签: xcode xamarin.ios monodevelop iboutlet

当我在Xcode中创建一个插座时,MonoTouch会在* .designer.cs文件中为该特定视图创建相同的属性。

namespace MyApp
{
    [Register ("CustomCell")]
    partial class CustomCell
    {
        [Outlet]
        MonoTouch.UIKit.UISwitch Toggle { get; set; }

        void ReleaseDesignerOutlets ()
        {
            if (Toggle != null) {
                Toggle.Dispose ();
                Toggle = null;
            }
        }
    }
}

但正如您所看到的,将这些属性范围限定为私有。

有没有办法通过XCode或MonoTouch告诉系统这些应该生成为public,protected还是internal?

当然,我可以在这个部分类的实现方面公开属性,它们充当这些属性的代理,但我希望有一种更清洁的方式。

2 个答案:

答案 0 :(得分:2)

不要担心它们是属性,这是出口的实施细节。您可以将它们视为私有字段 - 因此可以通过非设计器类部件上更易于访问的属性来公开它们。

使它们更易于访问的另一种方法是将它们移动到非设计器类部分。 Outlets不必属于设计师类部分。

同步的工作原理:

设计器文件的工作方式是当MD同步到Xcode时,它会找到类的所有部分的所有出口,包括设计器类,并将它们同步到obj-c头文件中。当它将obj-c头文件同步回MD时,它会尝试查找非设计器类部件中的每个出口,然后使用不匹配的出口重新生成设计器文件。

这意味着如果在obj-c头文件中添加插座,它将被添加到设计器文件中。这也意味着如果你删除了obj-c头文件中的一个插座,当设计器文件被重新生成时,它将有效地从设计器文件中删除 - 除非它在某个其他类部件中,在这种情况下,删除将不会被同步

obj-c头文件中的出口没有任何可访问性,因此MD在重新生成头文件时无法同步,而private是一个很好的默认值,因为它促进了封装,并且如果需要,您可以轻松地公开它们包装器属性或移动它们。

答案 1 :(得分:0)

目前无法让MonoDevelop为曝光的插座生成不同的可见性属性。

您想到的用例场景是什么?