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

时间:2011-10-31 00:58:29

标签: ios objective-c xamarin.ios

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

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

或者可能有完全不同的方法吗?

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

6 个答案:

答案 0 :(得分:27)

假设您有2个文本字段实例变量连接到您在Interface Builder中创建的文本字段。让我们称他们为myReadOnlyTextFieldmyEditableTextField。确保将Interface Builder中每个文本字段的delegate属性连接到视图控制器("文件所有者") [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;
}

来自UITextFieldDelegate Documentation

  

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

     

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

     

<强>参数
  textField - 要编辑的文本字段   开始。

     

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

     

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

     

委托实现此方法是可选的。如果是   不存在,编辑继续进行,好像此方法返回YES。

UITextField Documentation也很好读。


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

- (void)viewDidLoad {
    [super viewDidLoad];
    // .....
    myReadOnlyTextField.delegate = self;
    myEditableTextField.delegate = self;
}

答案 1 :(得分:15)

尽管您不需要键盘,textField:shouldChangeCharactersInRange:replacementString:非常有用。它会阻止文本字段进行编辑,但与textFieldShouldBeginEditing:形成对比仍然可以选择。

在monotouch中:

var txt = new UITextField();
txt.ShouldChangeCharacters += (field, range, replacementString) => false;

答案 2 :(得分:3)

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

答案 3 :(得分:1)

因为您在MonoTouch中工作,所以可以使用以下代码行:

myReadOnlyButton.ShouldBeginEditing = t =>
{
  //event code
  return false;
};

答案 4 :(得分:1)

目标C:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

  return NO;
}

迅速:

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

  return false
}

答案 5 :(得分:-1)

我个人使用borderStyle = .none + userInteractionEnabled = false使其看起来像普通标签。