0

我的视图中有一个文本字段条目,我想在后台操作期间阻止访问。我试过使用editable属性,它在后台操作期间成功阻止了访问,但是当我将editable设置为YES时,键盘出现并且文本字段成为第一响应者。在更改可编辑后关闭键盘不会做任何事情:

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

我考虑过添加一个清晰的 UIView,它只是在关闭键盘后阻止对 UITextView 的访问,但这似乎有点矫枉过正。有没有正确的方法来处理这个?

只是为了让人们不必阅读所选答案以外的内容:事实证明这是 SDK 中的“已知问题”,您可以在发行说明中找到它。使用 userInteractionEnabled 执行相同的功能,只要您确保自己关闭键盘。

4

6 回答 6

6

尝试textView.userInteractionEnabled = NO;

于 2009-10-12T16:10:46.010 回答
1

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

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

于 2009-10-12T16:11:54.167 回答
0

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

由于视图专注于更改editable属性,这将更容易。

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

您还可以考虑使用类别来添加功能。但是对于这些解决方案中的任何一个,仍然回到如何完成你需要的东西的问题上......

于 2009-10-12T16:13:15.240 回答
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

然后代替我放在上面的代码(而不是使用可编辑的)。要禁用(假设我有一个名为 blocker 的 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];
于 2009-10-12T16:15:23.147 回答
0

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

- (BOOL) canBecomeFirstResponder { return NO; }
于 2009-10-12T16:16:06.437 回答
0

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

如果处于阻塞状态,那么您将使用一个委托 where textViewShouldBeginEditingreturns NO

另一个代表textViewShouldBeginEditing将返回YES

于 2009-10-12T16:17:27.837 回答