iPhone/iPad:如何使UITextField只读(但不禁用)?

new*_*man 18 objective-c xamarin.ios ios

我知道之前已经问过这个问题,但我对答案不满意,即禁用它.有一个根本区别:禁用视图不会触发事件,但对于只读视图,它仍然应该触发事件(例如TouchUpInside),我需要它.我唯一不需要的是键盘输入.

原因是我有几个输入字段,有些可以UITextField直接使用,有些则不能.我希望他们看起来很相似.所以,我想用它UITextField来显示所有这些.其中一些需要是只读的,以便我可以使用修饰事件来替代输入.

或者可能有一种完全不同的方式来做到这一点?

编辑:这是我的MonoTouch项目.我对Objective-c的了解非常有限.

cho*_*own 29

假设您有2个文本字段实例变量连接到您在Interface Builder中创建的文本字段.让我们给他们打电话myReadOnlyTextFieldmyEditableTextField.确保将delegateInterface Builder中每个文本字段的属性连接到视图控制器("文件所有者")[1].现在,在视图控制器@implementation(.m文件)中,使用该方法textFieldShouldBeginEditing:并输入一些逻辑来确定要允许编辑的文本字段以及不允许编辑的文本字段; 这样的事情:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    BOOL editable;
    if (textField == myReadOnlyTextField) {
        editable = NO;
    } else if (textField == myEditableTextField) {
        editable = YES;
    } else {
        // editable = YES/NO/Other Logic
    }
    return editable;
}
Run Code Online (Sandbox Code Playgroud)

UITextFieldDelegate文档:

textFieldShouldBeginEditing:
询问代理是否应在指定的文本字段中开始编辑.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

参数
textField - 即将开始编辑的文本字段.


YES如果应该启动编辑会话,则返回值 ; 否则,NO禁止编辑.

讨论
当用户执行通常会启动编辑会话的操作时,文本字段首先调用此方法以查看是否应该实际进行编辑.在大多数情况下,您只需从此方法返回YES即可继续编辑.

委托实现此方法是可选的.如果它不存在,则编辑继续进行,就像此方法返回YES一样.

UITextField文档也很好读.


[1]您也可以通过编程方式执行此操作.这是一个例子:

- (void)viewDidLoad {
    [super viewDidLoad];
    // .....
    myReadOnlyTextField.delegate = self;
    myEditableTextField.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)

  • @miliu,没有冒犯,但这是正确的答案.为什么不花时间实施它,也许在做这个时学习一些目标-c? (8认同)

m8l*_*abs 15

尽管你不需要键盘,但是textField:shouldChangeCharactersInRange:replacementString:非常有用.它可以防止文本字段编辑,但仍然可以选择与之对比textFieldShouldBeginEditing:.

在monotouch:

var txt = new UITextField();
txt.ShouldChangeCharacters += (field, range, replacementString) => false;
Run Code Online (Sandbox Code Playgroud)

  • 当用自定义视图(例如日期选择器)替换输入视图(键盘)时,这很有用. (2认同)

小智 5

您可以有两个选择:a) 使用 ShouldBeginEditing 并返回 false,但您不能在文本字段中使用 PickerView 作为 InputView。b) 使用将阻止编辑但允许将 InputView 与 PickerView 一起使用的 ShouldChangeCharacters。