使用自定义版本的UITextField时抛出异常

时间:2013-05-23 18:20:24

标签: xamarin.ios uitextfield xamarin

我正在尝试使用扩展UITextField的自定义控件,以便在激活文本字段时隐藏选择插入符号。文本字段有一个选择器作为其输入视图,因此当选择器处于活动状态时,我不希望文本字段中的闪烁光标。我最终会向自定义控件添加类似于公开图标的内容,但是现在我只是想隐藏光标。我得到了这个解决方案here

我的应用程序正在抛出一个异常,但是:从目标c调用了一个已经过GC 的TestCustomControl.PickerTextField(0xC8BC970)类型的托管对象。

如果我将自定义字段更改回UITextField,则不会收到错误。

这是我的自定义类:

using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace TestCustomControl
{
    [Register("PickerTextField")]
    public class PickerTextField : UITextField
    {
        public override RectangleF GetCaretRectForPosition (UITextPosition position)
        {
            return RectangleF.Empty;
        }
    }
}

我已经将我的Outlet设为UITextField和PickerTextField,我尝试在我的PC上运行VS 2012,在Mac上运行Xamarin Studio 4.0.8(版本2)。在所有情况下,如果在XCode中我将字段设置为UITextField它工作正常(但我得到一个闪烁的光标),如果我将它设置为PickerTextField,我得到 GC 异常。

我可以在某个地方发布整个项目的代码,如果它有用(它只是一个ViewController和View,自定义控件类,我的选择器的模型,XIB文件,以及为其创建的其他文件)一个新项目)。

1 个答案:

答案 0 :(得分:1)

你错过了IntPtr构造函数。如果从XIB创建实例,则需要这样做。添加默认的c'tor也是个好主意:

   [Register("PickerTextField")]
        public class PickerTextField : UITextField
        {
            public PickerTextField(IntPtr handle) : base(handle)
            {}

public PickerTextField() : base()
            {}

            public override RectangleF GetCaretRectForPosition (UITextPosition position)
            {
                return RectangleF.Empty;
            }
        }

这很有趣,因为当我开始使用MonoTouch时,我实际上也问了同样的问题:How to use custom UIView subclass in XIB editor with Monotouch?