2

我正在使用 MonoTouch 并创建了一个扩展 UIButton 的 MyButton 类。这实际上是我在使用自定义 UIScrollView时遇到的相同问题的简化示例。MyButton 扩展了 UIButton 并添加了一些方法来做一些简单的事情,比如增加和减少一个计数器(这只是一个测试用例)。我还在我的类定义之前包含了 '[Register("MyButton")]',以便它向 Interface Builder (IB) 注册,这样我就可以添加一个 UIButton 并将其类指定为 MyButton。

工作原理: 我可以以编程方式将 MyButton 的实例添加到我的主视图中,它可以正确显示并按预期运行。

什么不起作用: 如果我尝试从 IB 添加 UIButton 并将其类指定为 MyButton,然后添加一个插座并指定它是 MyButton 类型,则我的应用程序在尝试加载主视图时崩溃,但异常:未处理托管异常:从objective-c 在已被GC'ed (System.Exception) 的iOSCustomUIView.MyButton (0xC2F40D0) 类型的托管对象上调用选择器

我发现类似的问题有这个问题,但视图控制器,而不是视图。所以我知道错误是相似的,但是在将新控制器推入堆栈等时视图控制器引用丢失的情况。就我而言,我不知道为什么我的对象在任何事情发生之前就已经被 GC加载。

我尝试创建额外的私有成员变量来引用我的 MyButton 插座(btnIncrement),但这没有帮助。我设置断点并在尝试实例化我的视图控制器的新实例时发生崩溃:(来自 AppDelegate.cs)

    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        window = new UIWindow (UIScreen.MainScreen.Bounds);

        viewController = new iOSCustomUIViewViewController ();
        window.RootViewController = viewController;
        window.MakeKeyAndVisible ();

        return true;
    }

为了定义自定义 UIButton 类并在 IB 中使用它,我有什么遗漏吗?这是 MonoTouch 中的错误吗?

4

1 回答 1

2

我在Xamarin 论坛上从 adamkemp 得到了很好的回应。解决方案是我需要编写一个接受IntPtr p参数的构造函数,因为这是从 xib 文件创建视图对象时调用的构造函数。就我而言,我只是定义了以下构造函数:

public MyButton(IntPtr p) : base(p)
{
    // Do initialization stuff here
}

由于我没有定义此构造函数,因此我的对象可能从未创建过。在这种情况下,说我的对象已被 GC 处理的日志消息有点误导。现在,我的应用程序视图全部加载成功。

于 2013-03-15T17:27:31.063 回答