Дополнительный вызов setMarkedText:selectedRange в iOS7?

В моем приложении у меня есть UITextInput реализовано так, что я могу обрабатывать многоступенчатый ввод с клавиатуры (японская, китайская клавиатуры) для моего пользовательского представления текста Я замечаю в iOS7, когда у вас есть текст, который помечен, и вы нажимаете одно из предложений над клавиатурой, чтобы заменить его, что setMarkedText:selectedRange вызывается дважды: один раз, когда он заменяет выделенный текст строкой, выбранной на панели над клавиатурой (как и следовало ожидать), и один раз, когда в качестве параметра отправляется пустая строка. В iOS6 он вызывается только один раз.

Мои вопросы, есть ли причина, по которой он это делает? И как мне отрегулировать setMarkedText:selectedRange для учета этого (перечислены ниже):

- (void)setMarkedText:(NSString *)markedText selectedRange:(NSRange)selectedRange
{
    NSRange selectedNSRange = self.textView.selectedTextRange;
    NSRange markedTextRange = self.textView.markedTextRange;

    if (markedTextRange.location != NSNotFound)
    {
        if (!markedText)
            markedText = @"";
        [self.text replaceCharactersInRange:markedTextRange withString:markedText];
        markedTextRange.length = markedText.length;
    }
    else if (selectedNSRange.length > 0)
    {
        [self.text replaceCharactersInRange:selectedNSRange withString:markedText];
        markedTextRange.location = selectedNSRange.location;
        markedTextRange.length = markedText.length;
    }
    else
    {
        [self.text insertString:markedText atIndex:selectedNSRange.location];
        markedTextRange.location = selectedNSRange.location;
        markedTextRange.length = markedText.length;
    }

    selectedNSRange = NSMakeRange(selectedRange.location + markedTextRange.location, selectedRange.length);

    self.textView.contentText = self.text;
    self.textView.markedTextRange = markedTextRange;
    self.textView.selectedTextRange = selectedNSRange;
}

Мой первый инстинкт - поставить if заявление вокруг содержания поговорка

if markedText != @""

но я не уверен, что я испортил бы некоторые другие случаи. У кого-нибудь есть какие-либо предложения о том, как учесть это изменение??

1 ответ

Решение

Парень из DTS рекомендовал это решение:

- (void)setMarkedText:(NSString *)markedText selectedRange:(NSRange)selectedRange 
{
    ...

    if (markedText == nil || markedText.length == 0 ) 
    {
        [self unmarkText];
    }
}

И, кажется, работает нормально.

Другие вопросы по тегам