如何防止UITextView中的文本输入?

时间:2009-10-12 15:53:35

标签: iphone objective-c uitextview

我的视图中有一个文本字段条目,我想在后台操作期间阻止访问。我已经尝试使用editable属性,该属性在后台操作期间成功阻止访问,但是当我将editable设置为YES时,键盘出现并且textfield成为第一个响应者。更改可编辑后立即关闭键盘无效:

// Broken code
textView.editable = YES;
[textView resignFirstResponder];

我考虑过添加一个清晰的UIView,它只是在解除键盘后阻止访问UITextView,但这看起来有些过分。有没有正确的方法来处理这个?

因此,人们不必阅读比选定答案更远的内容:事实证明,这是SDK中的“已知问题”,您可以在发行说明中找到它。使用userInteractionEnabled执行相同的功能,只要您确保自己解除键盘。

6 个答案:

答案 0 :(得分:6)

尝试textView.userInteractionEnabled = NO;

答案 1 :(得分:1)

将UIView放在UITextView前面,背景颜色为深色(或白色),alpha设置为低(如5%),以完全覆盖textview。默认为隐藏。

如果您希望禁用textinput,请将resignFirstResponder发送给它,然后在顶部显示隐藏层。它拦截用户输入(并忽略它)。阿尔法颜色会使它看起来“暗淡”。完成后台操作后,只需将封面视图设置为隐藏,即可开始使用。如果你想获得幻想,你可以做UIView alpha淡入淡出动画。

答案 2 :(得分:0)

我不确定“正确的方法”,但我可能会做透明的视图解决方案......我同意它看起来有点矫枉过正,但简单的解决方案往往是一个很好的答案。

由于视图专注于更改editable属性,因此更容易。

我能想到的其他解决方案是派生自定义UITextView并重新编码可以完成您要执行的操作的可编辑属性(或创建新方法)。这是一个很好的面向对象的解决方案,但这可能会很麻烦。

您也可以考虑使用Category添加功能。但是对于这些解决方案中的任何一个,仍然是如何完成你需要的方式之一......

答案 3 :(得分:0)

感谢上帝,有人想出了更好的回应。我最初使用以下阻止程序构建它,但userInteractionEnabled BOOL更容易。

事实证明,问题是UITextView的已知问题。我的解决方法:

#import <UIKit/UIKit.h>

/**
 God damn SDK bug means that you can't use editable to enable/disable a 
 UITextView (It brings up the keyboard when re-enabling)
 */
@interface StupidF_ingTextViewBlocker : UIView {
}
@end


@implementation StupidF_ingTextViewBlocker

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // Initialization code
        self.backgroundColor = [UIColor clearColor];
        self.opaque = NO;
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}

@end

然后代替我放在上面的代码(而不是使用可编辑的代码)。要禁用(假设我有一个名为阻止程序的iVar):

// Put this in a lazy loading property or in loadView
blocker = [[StupidF_ingTextViewBlocker alloc] initWithFrame:writeView.frame];

// The blocker code  ~= textView.editable = NO
[self.view addSubview:blocker];

// Removing the blocker ~= textView.editable = YES
[blocker removeFromSuperView];

答案 4 :(得分:0)

子类UITextView,并实现一个方法:

- (BOOL) canBecomeFirstResponder { return NO; }

答案 5 :(得分:0)

使用UITextViewDelegate。您需要根据当前状态换出委托对象。

如果处于阻止状态,那么您将使用textViewShouldBeginEditing返回NO的委托。

其他代表的textViewShouldBeginEditing将返回YES