2011-10-31 30 views
15

我明白这个问题之前已经被问过了,但是我对答案不满意,即使它被禁用。有一个根本的区别:禁用视图不会触发事件,但对于只读视图,它仍应触发事件(如TouchUpInside),并且我需要它。只有我不想要的是键盘输入。iPhone/iPad:如何使UITextField只读(但不禁用)?

原因是我有几个输入字段,有些可以直接使用UITextField,其他则不可以。我想让他们看起来很相似。所以,我想用UITextField来显示它们。其中一些需要只读,以便我可以使用touch up事件进行替代输入。

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

编辑:这是我的MonoTouch项目。我对object-c的知识非常有限。

+0

为所有'不可编辑的'textFields分配一个通用标记值并在'textFieldDidBeginEditing'方法上检查它并轻松返回BOOL是很容易的。 – Gokul

回答

25

假设您有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; 
} 
+0

非常感谢您的快速响应。对不起,我忘了在我的问题中提到我正在使用MonoTouch项目。从我有限的对象 - 知识,我不明白你在这里做什么。其实,如果可能的话,我正在寻找一个简单的解决方案(如设置属性)。如果它需要很多代码才能使其工作,我可能会尝试找到不同的解决方案。 – newman

+1

十几行代码对你来说很重要?顺便说一句,你正在设置一个属性,委托属性。该代表决定天气,你可以编辑该字段。 – NJones

+8

@ miliu,没有冒犯,但这是正确的答案。为什么不花时间实施它,也许在学习时学习一些Objective-C? – sosborn

14

尽管事实上你不需要键盘,textField:shouldChangeCharactersInRange:replacementString:是非常有用的。它可以防止编辑文本字段,但仍然可以选择,而不是textFieldShouldBeginEditing:

在MonoTouch的:

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

当用自定义视图(例如日期选择器)替换输入视图(键盘)时,这很有用。 – andref

1

,因为你是在MonoTouch的工作,你可以使用下面的代码行:

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

你可以有两种选择: 一)使用ShouldBeginEditing与回报假,但是你不能在你的文本字段中使用PickerView作为InputView。 b)使用ShouldChangeCharacters会阻止编辑,但会允许在PickerView中使用InputView。

相关问题