使用自定义版本的 UITextField 时引发异常

Posted

技术标签:

【中文标题】使用自定义版本的 UITextField 时引发异常【英文标题】:Exception thrown when using a custom version of UITextField 【发布时间】:2013-05-23 18:20:24 【问题描述】:

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

不过,我的应用抛出了一个异常:Selector 从objective-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 文件,以及为一个新项目)。

【问题讨论】:

好点 - 它发生在应用程序启动时。调试器在我的 AppDelegate 中的 window.MakeKeyAndVisible() 上中断。我根据您的建议创建了一个要点,其中包含项目中的所有文件:https://gist.github.com/jfren484/5638688。 【参考方案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?

【讨论】:

是的,成功了!非常感谢。异常中的任何内容都不会向我指出该解决方案。

以上是关于使用自定义版本的 UITextField 时引发异常的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 UlTableViewCell 中使用 UITextField 时 resignFirstResponder 崩溃

当我在 SE 中向上滚动时,自定义 UITableViewCell 中的 UItextfield 文本打印为零

自定义表格单元格的uitextfield

打开表情符号键盘时自定义 UITextField 冻结应用程序?

使用 Xcode 7 自定义 UITableViewCell 和 UITextfield

在自定义 UITableCell 中从 UITextField 调用 textFieldShouldReturn 时遇到问题