我在 MonoTouch 中将 UIButton 子类化,但底层 ObjC 类仍然是 UIButton

Posted

技术标签:

【中文标题】我在 MonoTouch 中将 UIButton 子类化,但底层 ObjC 类仍然是 UIButton【英文标题】:I subclassed UIButton in MonoTouch but underlying ObjC class is still UIButton 【发布时间】:2012-10-18 07:42:59 【问题描述】:

我有继承 UIButtonBackButton。 它没有 xib,非常简单,并且包含一些我省略的布局逻辑。

我是这样声明的:

[Register("BackButton")]
public class BackButton : UIButton

    public BackButton (string text, EventHandler handler)
        : base (UIButtonType.Custom)
    
        TouchUpInside += handler;
        SetTitle (text, UIControlState.Normal);
    

    public BackButton(IntPtr handle) : base(handle)  

如果我在另一个视图的 xib 中使用BackButton,它的底层类被视为BackButton

但是,当我从代码创建实例时,底层类只是 UIButton:

这很令人沮丧,因为我正在为这个类尝试use UIAppearance,我需要它是正确的实例。

有什么问题?

【问题讨论】:

【参考方案1】:

事实证明,我必须调用无参数的 UIButton 构造函数,而不是我正在调用的构造函数。 从构造函数定义中删除 : base (UIButtonType.Custom) 就足以让它工作:

public BackButton (string text, EventHandler handler)
     // : base (UIButtonType.Custom) -- remove this line

    TouchUpInside += handler;
    SetTitle (text, UIControlState.Normal);

事后看来,这完全有道理,因为 MonoTouch 提供的 UIButton(UIButtonType) 构造函数实际上调用了 [UIButton buttonWithType:]

public UIButton (UIButtonType type) : base (
    Messaging.IntPtr_objc_msgSend_int (UIButton.class_ptr,
        UIButton.selButtonWithType_, (int)type)
    )  

我想,[UIButton buttonWithType:] 不可能知道我的自定义视图,所以它只会创建一个 UIButton

【讨论】:

漂亮,谢谢。我有一个按钮,其中 IntPtr 构造函数可以完美地工作,而当我使用 UIButtonType 从代码创建一个按钮时却没有。这很有意义,但在找到您的答案并获得“哈哈”时刻之前,我尝试了很多方法。

以上是关于我在 MonoTouch 中将 UIButton 子类化,但底层 ObjC 类仍然是 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

如何在MonoTouch中为继承的视图创建UIAppearance代理?

单击重置(UIButton)应用程序已关闭

在 TabBar 中将 UIButton 保持在前面

swift 在代码中将生成的imageView变成UIButton

Swift:在 UIbutton 中将 fontawesome 图标与字符串混合

摆脱圆形矩形按钮的圆角(MonoTouch)