0

我有一个NSArrayof NSStrings,我想将其用作 a 中的标记UITextField,这样我就无法选择或删除标记中的单个字符。总的来说,我想创建一种类似于计算器的效果,按退格键会删除整个函数,而不仅仅是其中的单个字符。标记还必须与其他文本一起突出显示。

我该怎么做呢?

(我正在尝试实现Calc 2M中看到的文本字段的行为)

编辑:

我通过使我的文本字段使用属性字符串来解决这个问题,并为我的标记设置了一种特殊的颜色。然后,我使用手势识别器拦截文本选择以触发事件以移动选择的起点和终点以环绕标记而不是实际选择。我认为这不是最好的方法,所以我将把它作为编辑而不是答案。

编辑2:

另一个与我一致的问题:<UITextinputDelegate> 协议实现的问题

4

2 回答 2

0

好吧,在尝试了很多方法来解决这个问题之后,我决定只使用以下方法UITextView来代替UITextFieldas :UITextFieldDelegate

- (void)textViewDidChangeSelection:(UITextView *)textView

因为我希望我的标记在我的 中脱颖而出UITextView,所以我决定使用NSAttributedString突出显示我的文本。由于标记现在具有与普通文本不同的属性,因此我可以使用以下内容检查所选文本是否为标记:

- (id)attribute:(NSString *)attributeName atIndex:(NSUInteger)index effectiveRange:(NSRangePointer)aRange

我写了一个方法,它将接受任何UITextPosition给定的UITextView并以 a 的形式返回标记的最近左开始NSInteger。这样我就可以轻松地使用它来制作NSRange

- (NSInteger)textViewWrappedIntegerFromPosition:(UITextPosition *)position forTextField:(UITextView *)textView
{
    NSInteger integer = [textView offsetFromPosition:textView.beginningOfDocument toPosition:position];
    NSInteger newInteger = integer;
    UIColor *color = [textView.attributedText attribute:NSForegroundColorAttributeName atIndex:integer-1 effectiveRange:NULL];

    // left of it is a character from a token
    if ([[UIColor colorWithRed:0.5 green:0.5 blue:1.0 alpha:1.0] isEqual:color])
    {
        NSInteger newInteger = integer+1;
        UITextPosition *startMinus = [textView positionFromPosition:position offset:-1];
        NSInteger startMinusInt = [textView offsetFromPosition:textView.beginningOfDocument toPosition:startMinus];
        UIColor *colorMinus = [textView.attributedText attribute:NSForegroundColorAttributeName atIndex:startMinusInt effectiveRange:NULL];

        // left and right of it is a character from a token
        if ([[UIColor colorWithRed:0.5 green:0.5 blue:1.0 alpha:1.0] isEqual:colorMinus]) // both collision
        {
            while ([colorMinus isEqual:[UIColor colorWithRed:0.5 green:0.5 blue:1.0 alpha:1.0]] && startMinusInt > 0)
            {
                // I used offset -1 again because when I wrote this I was testing something else
                position = [textView positionFromPosition:position offset:-1];
                startMinusInt = [textView offsetFromPosition:textView.beginningOfDocument toPosition:position];
                colorMinus = [textView.attributedText attribute:NSForegroundColorAttributeName atIndex:startMinusInt effectiveRange:NULL];
            }
            if (startMinusInt != 0)
            {
                newInteger = startMinusInt+1;
            }
            else
            {
                newInteger = startMinusInt;
            }
            return newInteger;
        }
        return newInteger;
    }
    return newInteger;
}

使用此方法,我可以计算选择的startandend UITextPosition是否在标记中或与标记相邻,然后我可以继续创建新范围并将其设置为新选择:

[textView setSelectedRange:NSRangeMake(newStartInt,newEndInt-newStartInt];
于 2013-09-21T17:12:16.913 回答
0

在 OS X 下,这是使用NSTokenField. iOS 上没有官方实现,但有几个人推出了自己的实现。检查此问题以获取一些示例:是否有与 NSTokenField 控件等效的 iPhone?

于 2013-09-09T11:02:40.370 回答