Вопрос по iphone, xcode, objective-c – Как установить позицию курсора для UITextView при вводе пользователем?

6

I am looking for a simple answer for this problem...

у меня естьUITextView в котором пользователь может начать печатать и нажать кнопку Готово и отказаться от клавиатуры.

Когда он захочет отредактировать его снова, я хочу, чтобы курсор (мигающая линия) находился на первой позицииtextView, не в конце textView.(act like a placeholder)

Я старалсяsetSelectedRange сNSMakeRange(0,0) наtextViewDidBeginEditing, Но это не работает.

More Info:

Видно, что .. когда пользователь нажимает наtextView cursor приходит в положение, когда пользователь нажимает наtextView.

Я хочу, чтобы он всегда мигал в исходном положении, когдаtextViewDidBeginEditing.

@tipycalFlow: Спасибо, но я уже это проверил. Это не имеет отношения к моему вопросу. Legolas
Посмотрите, поможет ли это -stackoverflow.com/questions/1500233/… tipycalFlow

Ваш Ответ

6   ответов
-3
[_detailAreaView setTextContainerInset:UIEdgeInsetsMake(8, 11, 8, 11)];
Это не связано с вопросом, это просто показывает, как создать врезку, перемещая таким образом текстовую позицию в текстовом представлении.
11

- (void) viewDidLoad {
    UITextView *textView = [[UITextView alloc] initWithFrame: CGRectMake(0, 0, 200, 200)];
    textView.text = @"This is a test";
    [self.view addSubview: textView];
    textView.delegate = self;
    [textView release];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(tapped:)];
    [textView addGestureRecognizer: tap];
    [tap release];
}
- (void) tapped: (UITapGestureRecognizer *) tap {
    [textView becomeFirstResponder];
} 

- (void) textViewDidBeginEditing:(UITextView *)textView {
    textView.selectedRange = NSMakeRange(0, 0);
}

Я предполагаю, что это внутренний механизм UITextView для установки курсора, когда пользователь нажимает на него. Мы должны переопределить это, подключив распознаватель жестов и вызовbecomeFirstResponder вместо.

Ссылка, которую вы разместили в неверной -Unknown Paste ID! Legolas
Здравствуйте, одна помощь мой код не отображать курсор ввода с помощью пользовательской клавиатуры?
это работает вчера. Я перепечатал код здесь для вас.
1

чтобы помочь вам в полной мере, но что происходит, когда вы пытаетесь играть с другимиselectedRanges? Скажи если ты[... setSelectedRange:[NSMakeRang,e(0,1)]] или же[... setSelectedRange:[NSMakeRange(1,0)]]? Перемещает ли он курсор куда-нибудь?

Гектометр Это так же, как я изложил в своем вопросе. Это не работает. Положение курсора = положение пользовательского нажатия. Legolas
Если это не меняет поведение, похоже, что оно не вызывает вашsetSelectedRange совсем. Поставить точку останова на вызов и выполнить его до конца?
Это действительно так. Я обеспокоен тем, что - это не решает проблему. Legolas
15

чтобы заставить его работать, необходимо реализовать метод- (void)textViewDidChangeSelection:(UITextView *)textView, в твоем случае:

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    [textView setSelectedRange:NSMakeRange(0, 0)];
}

вам нужно будет определить, когда пользователь начинает редактировать или выбирать текст

Этот ответ должен быть принят как правильный.
Спасибо отличный ответ
Легенда! Поиск по переполнению стека всегда быстрее, чем читать документ :)
Работал как шарм! Спасибо!
Это лучшее решение, с которым я когда-либо сталкивался. Это действительно должен быть главный ответ!
6

возникает задержка, когда вы становитесь первым респондентом, который не позволяет вам изменитьselectedRange в любом изtextView*BeginEditing: методы. Если вы попытаетесь отложитьsetSelectedRange: (скажем, сperformSelector:withObject:afterDelay:) это показывает уродливый рывок.

Решение на самом деле довольно простое - проверка порядка методов делегатов дает подсказку:

textViewShouldBeginEditing: textViewDidBeginEditing: textViewDidChangeSelection:

настройкаselectedRange в последнем методе (3) делает трюк, вам просто нужно убедиться, что вы перемещаете курсор только в первый раз, когдаUITextView становится первым респондентом, так как метод (3) вызывается каждый раз, когда вы обновляете содержимое.

Переменная BOOL установлена вshouldChangeTextInRange: one of the methods (1), (2) и проверка переменной в (3) должна сделать свое дело ... просто не забудьте сбросить переменную после изменения положения, чтобы избежать постоянного сброса курсора :).

Надеюсь, поможет!

EDIT

После нескольких раундов тестирования я решил установить флаг BOOL вshouldChangeTextInRange: вместо (2) или (3), поскольку он оказался более универсальным. Смотрите мой код:

@interface MyClass
{
    /** A flag to determine whether caret should be positioned (YES - don't position caret; NO - move caret to beginning). */
    BOOL _isContentGenerated;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    // deleting
    if([text length] == 0)
    {
        // deleting last character
        if(range.length == [[textView text] length])
        {
            // reached beginning
            /** 
             code to show placeholder and reset caret to the beginning 
            */
            _isContentGenerated = NO;
        }
    }
    else
    {
        // adding
        if(range.location == 0)
        {
            /** 
             code to hide placeholder
            */
            _isContentGenerated = YES;
        }
    }
    return YES;
}

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    if(!_isContentGenerated)
    {
        [textView setSelectedRange:NSMakeRange(0, 0)];
    }
}
@ смысл-вопросы спасибо за ваше предложение, добавил код ...
Спасибо, только что дал вам 20 баллов за другие ответы :-)
@ смысл-имеет значение Теперь, это то, что я называю Рождеством: D Спасибо!
Отличный ответ, но его можно улучшить, добавив код.
0

UITextView который выступает в качестве заполнителя для textView. Нажатие на UILabel отправит действие вниз в textView иbecomeFirstResponder, Как только вы начнете печатать, сделайте метку скрытой.

@fatuhoku: & quot; ... UILabel над UITextView, который действует как заполнитель для textView & apos;
Кажется невероятно счастливым. Почему не UIView вместо UILabel?

Похожие вопросы