En наша предыдущая статья Мы включили метку, текстовое поле и кнопку в интерфейс нашего приложения. Мы хотели, чтобы содержимое метки обновлялось в соответствии с тем, что было введено в текстовое поле при нажатии кнопки. Мы (шаг 1) создали проект, а (шаг 2) использовали InterfaceBuilder для определения экрана. Теперь мы продолжим выполнение остальных шагов, чтобы оставить приложение работающим.
Шаг 3. Создайте переменные в ViewController.
У нас наш интерфейс правильный. Фактически, если бы мы сделали Build & Go, мы бы увидели, как у нас дела:
Но при нажатии на кнопку, очевидно, ничего не происходит, потому что мы не сделали минимальных существенных изменений. На этом шаге 3 мы собираемся представить переменные и методы в HelloWorldViewController как в интерфейсе (файл .h), так и в реализации (файл .m). Для этого, как мы указали в конце предыдущего поста, мы должны знать, что TextField соответствует классу UITextField, а Label - классу UILabel. Эти 2 класса находятся в рамках UIKit.
Если мы не закрыли и не сохранили Interface Builder, мы делаем это и в XCode открываем файл HelloWorldViewController.h. Прямо сейчас в коде будет что-то вроде этого:
Мы уже смотрим на Objective-C. В этом коде мы видим объявление импорта библиотеки UIKit, где находятся классы UILabel и UITextField. Мы видим, как объявлен интерфейс и что он расширяется от универсального UIViewController UIKit.
В код интерфейса мы включаем следующий код:
Теперь мы можем объяснить, что мы сделали:
- Мы объявили в блоке @interface 2 атрибута типа UILabel и UITextField с двумя именами переменных * label и * textField соответственно. Впереди появляется IBOutlet. Что все это значит? Мы объясняемся. IBOutlet не является типом переменной; - это директива, которая помогает Interface Builder узнать о существовании этих переменных типа UILabel и UITextField. Кстати, помните, что в предыдущей статье мы показали вам трюк, чтобы узнать типы переменных объектов управления (кнопки, метки, текстовые поля и т. Д.) В Interface Builder. С другой стороны, проблема со знаком * перед именем переменной может удивить программистов Java, не столько программистов C ... но они узнают, что именно так вы будете писать переменные экземпляра в Objective-C.
- Объявлены свойства UILabel и UITextField. неатомные и сохранить мы пока не увидим, это связано с управлением памятью.
- Мы видим, что объявляем метод updateText. Перед ним стоит знак -, указывающий, что это метод экземпляра, а не метод класса (для них поясняется знак +). Мы не можем вдаваться в объяснение этого, потому что это базовое объектно-ориентированное программирование ... Этот метод ничего не возвращает (то есть void) и получает параметр типа id. В основном это относится к идентификатору объекта, который вызовет наш метод updateTexto, который обновит значение метки. Мы можем догадаться, поскольку этим элементом управления будет сама кнопка ...
Как только это будет сделано, мы закончим с шагом 3.
Шаг 4. Свяжите элементы управления представления с переменными контроллера.
Если мы рассмотрим, с одной стороны, мы разработали наш интерфейс с помощью Interface Builder, а с другой стороны, у нас есть переменные, связанные с этими элементами управления, в HelloWorldViewController.h (интерфейс класса контроллера HelloWorldViewController.m). Однако между представлением и контроллером все еще нет связи, то есть мы не дали никаких инструкций, чтобы связать, например, текстовое поле, которое мы разрабатываем в Interface Builder, с переменной типа UITextField, которую мы поместили в класс. Теперь займемся этой задачей. Мы снова открываем Interface Builder, щелкнув HelloWorldViewController.xib, щелкнув текстовое поле, и в палитре Inspector мы перейдем на вторую вкладку (Подключения текстового поля). Мы видим, что есть раздел под названием Referencing Outlets, без каких-либо пометок. Это означает, что в настоящий момент Interface Builder не знает какой-либо связи между этим текстовым полем и IBOutlet (выходом Interface Builder) класса ... но у нас есть IBOutlet UITextField в нашем HelloWorldViewController, поэтому мы собираемся связать его.
Для этого, как мы видим на рисунке, щелкнув маленький кружок рядом с «New Referencing Outlet», мы перетащим к владельцу файла окна HelloWorldViewController.xib. Это позволит нам выбрать 2 варианта: view (полный вид) и textField (наша переменная). Очевидно, мы выбираем textField и, таким образом, связываем наше текстовое поле с переменной его типа UITextField. Между прочим, File'sOwner или владелец файла - не что иное, как наш класс контроллера ...
Повторяем операцию с меткой, связывая ее с меткой переменной нашего контроллера. А с кнопкой все по-другому. В этом случае мы собираемся связать его с нашей операцией updateTexto, но для конкретного события. Сделайте это с событием Touch Up Inside и выберите наш метод updateTexto:
И таким образом мы уже связали элементы управления, которые мы определили с помощью Interface Builder, и переменные, которые мы поместили в контроллер. Мы закрываем Interface Builder, сохраняя все, и переходим к последнему шагу, возвращаясь в XCode.
Шаг 5. Последние разработки.
В XCode мы открываем HelloWorldViewController.my и помещаем следующий код, чтобы наш класс выглядел так:
Если присмотреться, мы просто поместили блок @synthesize и реализацию метода, объявленного в интерфейсе .h, updateTexto. Ниже этого кода у вас будет много закомментированного кода.
Строка @synthesize делает что-то похожее на создание типичного геттера / сеттера (аксессоров / мутаторов), типичных для объектно-ориентированных языков (инкапсуляция). Они нужны нам, чтобы контроллер доходил до содержимого, например, текстового поля.
Как видите, метод updateTexto просто обновляет текст нашей метки содержимым текстового поля. Мы сделали.
Теперь мы просто выполняем Build & Go, и вы увидите, что при вводе текстовой строки и нажатии кнопки содержимое метки обновляется. В следующей статье мы внесем улучшения в наше приложение.
Очень хороший учебник, очень понятный и простой.
Что ж, я, должно быть, очень дыня потому что мне это не подходит. Я записал значение в String, и он берет текст, но не присваивает его метке, по крайней мере, он не рисует его, потому что я пытаюсь увидеть label.text, и он говорит мне, что выходит за рамки ...
Превосходные ваши учебные пособия, они действительно очень хорошо объясняют эту разработку для iphone, я надеюсь, вы продолжите публиковать больше учебных пособий.
привет
Привет, все круто, но не работает. Чтобы он заработал, мне пришлось связать представление построителя интерфейса с представлением в кубе, как вы учите делать с текстовым полем и меткой. В остальном большое спасибо.