使UITextView的部分不可删除?

Jos*_*ane 9 cocoa-touch objective-c uitextview ios

我有一个UITextView,需要使特定部分不可删除.它是视图文本的前10个字符.

希望你能提供帮助,我只是想要它,这样如果用户点击键盘上的删除键,它就会在它到达时说停止说第10个字符.

希望你能帮忙,谢谢.

编辑:

Progress1感谢您到目前为止的答案,让我进一步了解一下细节.

让我们说前缀是'123456789:'.我希望能够在这个前缀之后的任何地方输入,但它根本不可编辑,因此'123456789:'不应该被改变.Fichek的答案完美地做到了这一点,但是前缀并不总是存在,所以如何检测它何时不在textview中?我认为if语句做了这个,但似乎没有.

sch*_*sch 14

您可以使用委托方法textView:shouldChangeTextInRange:replacementText:告诉文本视图是否接受删除.

正如文件所说:

range:当前选择范围.如果范围的长度为0,则范围反映当前插入点.如果用户按下Delete键,则范围的长度为1,空字符串对象将替换该单个字符.

编辑

这是一种用户无法删除前十个字符的实现.但他可以在那里插入角色.

- (BOOL)textView:(UITextView *)textView shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (range.length==1 && string.length == 0) {
        // Deleting text
        if (range.location <= 9) {
            return NO;
        }
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

这是一个他无法修改前十个字符的实现.

- (BOOL)textView:(UITextView *)textView shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (range.location <= 9) {
        return NO;
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)


Fil*_*lic 8

sch的最后编辑提供了一个不错的答案,但我想提供一种稍微灵活的方法.

您必须记住复制/粘贴系统.用户可以选择文本字段中的所有文本,并尝试粘贴可能完全可以接受的整个值,但if (range.location <= 9) { return NO; }会拒绝它.我这样做的方法是将一个字符串放在一起,这个字符串是成功编辑的结果,然后检查该字符串是否以您想要的前缀开头.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *resultString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSLog(@"resulting string would be: %@", resultString);
    NSString *prefixString = @"blabla";
    NSRange prefixStringRange = [resultString rangeOfString:prefixString];
    if (prefixStringRange.location == 0) {
        // prefix found at the beginning of result string
        return YES;
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果要检查文本字段中的当前字符串是否以前缀开头,则可以使用rangeOfString:相同的方式:

NSRange prefixRange = [textField.text rangeOfString:prefixString];
if (prefixRange.location == 0) {
    // prefix found at the beginning of text field
}
Run Code Online (Sandbox Code Playgroud)