我的视图中有一个文本字段条目,我想在后台操作期间阻止访问。我已经尝试使用editable属性,该属性在后台操作期间成功阻止访问,但是当我将editable设置为YES时,键盘出现并且textfield成为第一个响应者。更改可编辑后立即关闭键盘无效:
// Broken code
textView.editable = YES;
[textView resignFirstResponder];
我考虑过添加一个清晰的UIView,它只是在解除键盘后阻止访问UITextView,但这看起来有些过分。有没有正确的方法来处理这个?
因此,人们不必阅读比选定答案更远的内容:事实证明,这是SDK中的“已知问题”,您可以在发行说明中找到它。使用userInteractionEnabled执行相同的功能,只要您确保自己解除键盘。
答案 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
。