Статьи

iOS SDK: UITextView & UITextViewDelegate

В этом учебном UITextView iOS SDK мы собираемся создать UITextView , реализовать UITextViewDelegate протокола UITextViewDelegate и использовать NSLog чтобы увидеть, когда эти методы вызываются. Мы также коснемся того, как ограничить количество символов в текстовом представлении и как использовать клавишу возврата для изменения клавиатуры. Читайте дальше, чтобы узнать, как реализовать эти функции в вашем приложении!


Запустите Xcode и нажмите «Файл»> «Создать»> «Проект». Нажмите «Приложение» под панелью iOS слева. Нажмите на иконку с названием «Single View Application» и нажмите «Next». В поле «Имя продукта» введите «TextViewARC» и введите имя для идентификатора вашей компании, например «com.companyName». Выберите «iPhone» в меню «Семейство устройств». Обязательно снимите флажки «Использовать раскадровки» и «Включить юнит-тесты» и установите флажок «Использовать автоматический подсчет ссылок», прежде чем нажимать «Далее». Выберите место для хранения вашего проекта и нажмите «Создать».

UITextView - Рисунок 1

В поле «Имя продукта» введите «TextViewARC» и введите имя для идентификатора вашей компании, например «com.companyName». Выберите «iPhone» в меню «Семейство устройств». Обязательно снимите флажки «Использовать раскадровки» и «Включить модульные тесты» и установите флажок «Использовать автоматический подсчет ссылок», прежде чем нажимать «Далее». Выберите место для хранения вашего проекта и нажмите «Создать».

UITextView - Рисунок 2

Объект UITextView может быть создан либо программно (то есть в коде), либо графически с помощью инструмента Interface Builder. Этот урок кратко покажет, как создать объект с помощью обоих методов.

Нажмите на файл «ViewController.m» и введите следующий код.

1
2
3
4
CGRect textViewFrame = CGRectMake(20.0f, 20.0f, 280.0f, 124.0f);
UITextView *textView = [[UITextView alloc] initWithFrame:textViewFrame];
textView.returnKeyType = UIReturnKeyDone;
[self.view addSubview:textView];

Это программно создает объект UITextView и добавляет его в представление ViewController .

Кроме того, вы можете создать UITextView в файле .xib. Начните с нажатия на файл .xib на панели «Navigator» окна Xcode. Нажмите «Вид» на панели «Структура документа» слева. Нажмите Вид> Утилиты> Показать библиотеку объектов. Прокручивайте библиотеку объектов в левом нижнем углу, пока не найдете объект «Текстовое представление». Нажмите, чтобы выбрать его, затем перетащите текстовое представление на представление. Отрегулируйте текстовое представление так, чтобы оно находилось в верхней части экрана и имело высоту около 125 пикселей.


Отказ от клавиатуры при касании фона может быть выполнен различными способами. Код ниже является примером одного такого метода. Нажмите на файл «ViewController.m» и добавьте следующую реализацию метода:

1
2
3
4
5
— (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@»touchesBegan:withEvent:»);
    [self.view endEditing:YES];
    [super touchesBegan:touches withEvent:event];
}

Проще говоря, делегат помогает двум объектам общаться друг с другом. В случае методов UITextViewDelegate , UITextView может UITextViewDelegate методы делегата, когда происходят определенные события, например, когда текстовое представление начинает редактирование. Когда один из методов обменивается сообщениями, у вас есть возможность выполнять пользовательские действия. Следующие UITextViewDelegate метода UITextViewDelegate демонстрируют, как вы можете сделать это.

Перед реализацией методов делегата, давайте вернемся и установим textView делегата textView в self , чтобы установить объект ViewController в качестве делегата UITextView . Нажмите на файл «ViewController.m». В методе viewDidLoad , где мы программно создали текстовое представление, добавьте следующий код над [self.view addSubview:textView]; строка (вы всегда можете обратиться к исходному коду, приложенному к этому сообщению за помощью).

1
textView.delegate = self;

Чтобы сделать то же самое с текстовым представлением, созданным в Интерфейсном Разработчике, щелкните по файлу «ViewController.xib». Выберите текстовое представление и нажмите «Просмотр»> «Утилиты»> «Показать инспектор подключений». Нажмите на стрелку «Розетки» на панели «Инспектор соединений», чтобы открыть ее. Щелкните по кружку напротив «делегата», затем перетащите его из кружка в «Владелец файла», чтобы установить связь между текстовым представлением и ViewController .

Нажмите «ViewController.h» и введите следующий код для соответствия протоколу UITextViewDelegate .

1
@interface ViewController : UIViewController <UITextViewDelegate>

Все UITextViewDelegate протокола UITextViewDelegate являются необязательными, то есть вам не нужно их реализовывать, если вы их не используете. Давайте поговорим о методах по мере их добавления.

Нажмите «ViewController.m» и добавьте следующий код.

1
2
3
4
5
6
7
8
9
— (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
    NSLog(@»textViewShouldBeginEditing:»);
    return YES;
}
 
— (void)textViewDidBeginEditing:(UITextView *)textView {
    NSLog(@»textViewDidBeginEditing:»);
    textView.backgroundColor = [UIColor greenColor];
}

Метод textViewShouldBeginEditing: вызывается непосредственно перед тем, как текстовое представление становится активным. Метод textViewDidBeginEditing: вызывается, когда текстовое представление становится активным и изменяется на статус первого респондента. Настройки поведения, которые вы хотите выполнить, когда текстовое представление становится активным, должны быть здесь. В нашем примере цвет фона текстового представления становится зеленым, когда текстовое представление активно.

Добавьте следующий код ниже предыдущих методов.

1
2
3
4
5
6
7
8
9
— (BOOL)textViewShouldEndEditing:(UITextView *)textView{
    NSLog(@»textViewShouldEndEditing:»);
    textView.backgroundColor = [UIColor whiteColor];
    return YES;
}
 
— (void)textViewDidEndEditing:(UITextView *)textView{
    NSLog(@»textViewDidEndEditing:»);
}

textViewShouldEndEditing: вызывается непосредственно перед тем, как текстовое представление становится неактивным. textViewDidEndEditing: вызывается, когда текстовое представление становится неактивным. Они похожи на два метода, вызываемых, когда текстовое представление начинает редактирование, и любой метод является подходящим местом для логики, которая запускается, когда пользователь завершает редактирование. В нашем примере мы используем textViewShouldEndEditing: чтобы вернуть цвет фона к его нормальному цвету.

Добавьте следующий код ниже предыдущих методов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
— (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    NSCharacterSet *doneButtonCharacterSet = [NSCharacterSet newlineCharacterSet];
    NSRange replacementTextRange = [text rangeOfCharacterFromSet:doneButtonCharacterSet];
    NSUInteger location = replacementTextRange.location;
     
    if (textView.text.length + text.length > 140){
    if (location != NSNotFound){
        [textView resignFirstResponder];
    }
    return NO;
    }
    else if (location != NSNotFound){
    [textView resignFirstResponder];
    return NO;
    }
    return YES;
}

Каждый раз, когда пользователь вводит символ на клавиатуре, непосредственно перед отображением символа вызывается метод textView:shouldChangeCharactersInRange:replacementString . Это удобное место для проверки символов, которые вводит пользователь, и запрещения определенных символов, которые вы хотите ограничить. В нашем примере мы используем клавишу done для отставки клавиатуры, проверяя, содержит ли текст замены какой-либо из символов в newLineCharacterSet . Если это символ из newLineCharacterSet , то нажата кнопка « newLineCharacterSet , и поэтому клавиатура должна уйти в отставку. Кроме того, проверяя текущую длину текстового представления каждый раз, когда вводится символ, и возвращая значение NO если оно превышает 140 символов, текстовое представление ограничивается не более чем 140 символами.

Добавьте следующий код ниже предыдущих методов.

1
2
3
— (void)textViewDidChange:(UITextView *)textView{
    NSLog(@»textViewDidChange:»);
}

Метод textViewDidChange: вызывается только тогда, когда текст в текстовом представлении изменяется пользователем. Существует множество вариантов поведения, которые вы можете настроить в зависимости от того, когда пользователь изменяет текст в текстовом представлении. Один из примеров — отображение количества оставшихся символов, если текстовое представление ограничено 140 символами. Каждый раз, когда изменяется текст, отображаемый номер может обновляться.

Добавьте следующий код ниже предыдущих методов.

1
2
3
— (void)textViewDidChangeSelection:(UITextView *)textView{
NSLog(@»textViewDidChangeSelection:»);
}

Метод textViewDidChangeSelection: вызывается при выделении фрагмента текста или изменении выделения, например при копировании или вставке фрагмента текста. Хотя это, вероятно, один из наименее используемых методов делегата, в определенных обстоятельствах может быть полезно настроить поведение текстового представления при выделении текста.


Нажмите «Построить»> «Выполнить» или нажмите стрелку «Выполнить» в верхнем левом углу. Откройте консоль и изучите текстовое представление. NSLog в каждом методе будет отображать строку в консоли при вызове этого метода делегата.

UITextView - Рисунок 3

Вот как выглядит текстовое представление в симуляторе:

UITextView - рисунок 4

Понимая, когда UITextViewDelegate методы протокола UITextViewDelegate , вы можете в полной мере воспользоваться функциональностью, встроенной в делегат. Если вы обнаружите, что один метод делегата не расположен в нужном месте во взаимодействии с пользователем, попробуйте другой метод. В какой-то момент вы найдете правильный способ размещения вашей логики, заставляя ваше приложение работать именно так, как вы хотите!