Подробный обзор примера приложения "Привет, iOS"Hello, iOS – Deep dive

Краткое пошаговое руководство, описывающее создание и запуск простого приложения Xamarin.iOS.The Quickstart walkthrough, introduced building and running a basic Xamarin.iOS application. Пришло время подробнее изучить принципы работы приложений iOS, чтобы создавать более сложные программы.Now it’s time to develop a deeper understanding of how iOS applications work so you can build more sophisticated programs. Это руководство описывает шаги, предпринятые в пошаговом руководстве "Привет, iOS", чтобы вы могли изучить основные принципы разработки приложений iOS.This guide reviews the steps that in the Hello, iOS walkthrough to enable understanding of the fundamental concepts of iOS application development.

Это руководство поможет вам выработать навыки и получить знания, необходимые для создания приложения iOS с одним экраном.This guide helps you develop the skills and knowledge required to build a single-screen iOS application. После его прохождения вы будете понимать, из каких компонентов состоит приложение Xamarin.iOS и как они связаны друг с другом.After working through it, you should have an understanding of the different parts of a Xamarin.iOS application and how they fit together.

Введение в Visual Studio для MacIntroduction to Visual Studio for Mac

Visual Studio для Mac — это бесплатная интегрированная среда разработки (IDE) с открытым исходным кодом, объединяющая в себе функции Visual Studio и XCode.Visual Studio for Mac is a free, open-source IDE that combines features from Visual Studio and XCode. Она включает в себя полностью интегрированный визуальный конструктор, текстовый редактор с инструментами рефакторинга, обозреватель сборок, средства интеграции исходного кода и другие возможности.It features a fully integrated visual designer, a text editor complete with refactoring tools, an assembly browser, source code integration, and more. В этом руководстве описаны некоторые базовые функции Visual Studio для Mac, но если сталкиваетесь с Visual Studio для Mac впервые, обратитесь к документации о Visual Studio для Mac.This guide introduces some basic Visual Studio for Mac features, but if you're new to Visual Studio for Mac, check out the Visual Studio for Mac documentation.

В Visual Studio для Mac, так же как в Visual Studio, код упорядочивается по решениям и проектам.Visual Studio for Mac follows the Visual Studio practice of organizing code into solutions and projects. Решение — это контейнер для одного или нескольких проектов.A solution is a container that can hold one or more projects. Проект может представлять собой приложение (например, для iOS или Android), вспомогательную библиотеку, тестовое приложение и т. д.A project can be an application (such as iOS or Android), a supporting library, a test application, and more. В приложение Phoneword был добавлен новый проект iPhone с помощью шаблона Приложение одного представления.In the Phoneword app, a new iPhone project was added using the Single View Application template. Исходное решение выглядело следующим образом:The initial solution looked like this:

Введение в Visual StudioIntroduction to Visual Studio

Visual Studio — это полнофункциональная интегрированная среда разработки (IDE) от корпорации Майкрософт.Visual Studio is a powerful IDE from Microsoft. Она включает в себя полностью интегрированный визуальный конструктор, текстовый редактор с инструментами рефакторинга, обозреватель сборок, средства интеграции исходного кода и другие возможности.It features a fully integrated visual designer, a text editor complete with refactoring tools, an assembly browser, source code integration, and more. Это руководство описывает, как использовать некоторые основные возможности Visual Studio с инструментами Xamarin для Visual Studio.This guide introduces some basic Visual Studio features with Xamarin Tools for Visual Studio.

Код в Visual Studio упорядочен по решениям и проектам.Visual Studio organizes code into solutions and projects. Решение — это контейнер для одного или нескольких проектов.A solution is a container that can hold one or more projects. Проект может представлять собой приложение (например, для iOS или Android), вспомогательную библиотеку, тестовое приложение и т. д.A project can be an application (such as iOS or Android), a supporting library, a test application, and more. В приложение Phoneword был добавлен новый проект iPhone с помощью шаблона Приложение одного представления.In the Phoneword app, a new iPhone project was added using the Single View Application template. Исходное решение выглядело следующим образом:The initial solution looked like this:

Структура приложения Xamarin.iOSAnatomy of a Xamarin.iOS application

Слева находится Панель решения, которая содержит структуру каталогов и все файлы, связанные с решением:On the left is the solution Pad, which contains the directory structure and all the files associated with the solution:

Справа находится область решений, которая содержит структуру каталогов и все файлы, связанные с решением:On the right is the solution Pane, which contains the directory structure and all the files associated with the solution:

В пошаговом руководстве Привет, iOS вы создали решение Phoneword и поместили внутрь него проект iOS — Phoneword_iOS.In the Hello, iOS walkthrough, you created a solution called Phoneword and placed an iOS project - Phoneword_iOS - inside it. Ниже перечислены элементы, входящие в проект:The items inside the project include:

  • References — содержит сборки, необходимые для создания и запуска приложения.References - Contains the assemblies required to build and run the application. Разверните этот каталог, чтобы отобразить ссылки на сборки .NET, такие как System, System.Core и System.Xml, а также ссылку на сборку Xamarin.iOS.Expand the directory to see references to .NET assemblies such as System, System.Core, and System.Xml, as well as a reference to the Xamarin.iOS assembly.
  • Packages — каталог Packages содержит готовые пакеты NuGet.Packages - The packages directory contains ready-made NuGet packages.
  • Resources — в папке Resources хранятся другие файлы мультимедиа.Resources - The resources folder stores other media.
  • Main.cs — это файл содержит главную точку входа для приложения.Main.cs – This contains the main entry point of the application. Для запуска приложения имя главного класса приложения передается в AppDelegate.To start the application, the name of the main application class, the AppDelegate, is passed in .
  • AppDelegate.cs — этот файл содержит главный класс приложения и отвечает за создание окна, формирование пользовательского интерфейса и прослушивание событий из операционной системы.AppDelegate.cs – This file contains the main application class and is responsible for creating the Window, building the user interface, and listening to events from the operating system.
  • Main.Storyboard — раскадровка содержит визуальную структуру для пользовательского интерфейса приложения.Main.storyboard - The Storyboard contains the visual design of the application’s user interface. Файлы раскадровки открываются в графическом редакторе, называемом конструктором iOS.Storyboard files open in a graphical editor called the iOS Designer.
  • ViewController.cs — контроллер представления обслуживает экран (представление), который пользователь просматривает и с которым взаимодействует.ViewController.cs – The view controller powers the screen (View) that a user sees and touches. Контроллер представления отвечает за обработку взаимодействия между пользователем и представлением.The view controller is responsible for handling interactions between the user and the View.
  • ViewController.designer.cs — designer.cs представляет собой автоматически созданный файл, который соединяет элементы управления в представлении и их представлениях кода в контроллере представления.ViewController.designer.cs – The designer.cs is an auto-generated file that serves as the glue between controls in the View and their code representations in the view controller. Так как это файл для внутреннего подключения, интегрированная среда разработки перезаписывает любые внесенные вручную изменения, и в большинстве случаев этот файл можно игнорировать.Because this is an internal plumbing file, the IDE will overwrite any manual changes and most of the time this file can be ignored. Дополнительные сведения о связи между визуальным конструктором и кодом резервирования см. в руководстве Введение в конструктор iOS.For more information on the relationship between the visual Designer and the backing code, refer to the Introduction to the iOS Designer guide.
  • Info.plist — в Info.plist задаются свойства приложения, такие как имя приложения, значки, изображения запуска и другие.Info.plist – The Info.plist is where application properties such as the application name, icons, launch images, and more are set. Этот файл предоставляет обширные возможности и подробно описан в руководстве Работа со списками свойств.This is a powerful file and a thorough introduction to it is available in the Working with Property Lists guide.
  • Entitlements.plist — список свойств назначений позволяет указать возможности приложения (так называемые технологии App Store), например iCloud, PassKit и многие другие.Entitlements.plist - The entitlements property list lets us specify application capabilities (also called App Store Technologies) such as iCloud, PassKit, and more. Дополнительные сведения о файле Entitlements.plist см. в руководстве Работа со списками свойств.More information on the Entitlements.plist can be found in the Working with Property Lists guide. Общие сведения о назначениях см. в руководстве Подготовка устройств.For a general introduction to entitlements, refer to the Device Provisioning guide.

Архитектура и принципы работы приложенияArchitecture and app fundamentals

Прежде чем приложение iOS сможет загрузить пользовательский интерфейс, оно должно удовлетворять двум требованиям.Before an iOS application can load a user interface, two things need to be in place. Во-первых, приложение должно определить точку входа — это первый код, который выполняется при загрузке приложения в память.First, the application needs to define an entry point – the first code that runs when the application’s process is loaded into memory. Во-вторых, оно должно определить класс для обработки событий на уровне приложения и взаимодействия с операционной системой.Second, it needs to define a class to handle application-wide events and interact with the operating system.

В этом разделе рассматриваются связи, показанные на следующей схеме:This section studies the relationships illustrated in the following diagram:

Main - методMain method

Главной точкой входа для приложения iOS является класс Application.The main entry point of an iOS application is the Application class. Класс Application определен в файле Main.cs, который содержит статический метод Main.The Application class is defined in the Main.cs file and contains a static Main method. Он создает экземпляр приложения Xamarin.iOS и передает имя класса делегата приложения, который будет обрабатывать события операционной системы.It creates a new Xamarin.iOS application instance and passes the name of the Application Delegate class that will handle OS events. Код шаблона для статического метода Main представлен ниже:The template code for the static Main method appears below:

using System;
using UIKit;

namespace Phoneword_iOS
{
    public class Application
    {
        static void Main (string[] args)
        {
            UIApplication.Main (args, null, "AppDelegate");
        }
    }
}

Делегат приложенияApplication delegate

В iOS класс делегата приложения обрабатывает системные события и располагается внутри AppDelegate.cs.In iOS, the Application Delegate class handles system events; this class lives inside AppDelegate.cs. Класс AppDelegate управляет окном приложения.The AppDelegate class manages the application Window. Окно является отдельным экземпляром класса UIWindow, который служит контейнером для пользовательского интерфейса.The Window is a single instance of the UIWindow class that serves as a container for the user interface. По умолчанию приложение получает только одно окно для загрузки своего содержимого, и это окно подключено к экрану (отдельный экземпляр UIScreen), который предоставляет ограничивающий прямоугольник, соответствующий размерам экрана физического устройства.By default, an application gets only one Window onto which to load its content, and the Window is attached to a Screen (single UIScreen instance) that provides the bounding rectangle matching the dimensions of the physical device screen.

AppDelegate также отвечает за подписку на обновления системы о важных событиях приложений, таких как завершение запуска приложения и нехватка памяти.The AppDelegate is also responsible for subscribing to system updates about important application events such as when the app finishes launching or when memory is low.

Код шаблона для AppDelegate приведен ниже:The template code for the AppDelegate is presented below:

using System;
using Foundation;
using UIKit;

namespace Phoneword_iOS
{

    [Register ("AppDelegate")]
    public partial class AppDelegate : UIApplicationDelegate
    {
        public override UIWindow Window {
            get;
            set;
        }

        ...
    }
}

Когда приложение определило свое окно, оно может начать загрузку пользовательского интерфейса.Once the application has defined its Window, it can begin loading the user interface. В следующем разделе рассматривается создание пользовательского интерфейса.The next section explores UI creation.

Пользовательский интерфейсUser interface

Пользовательский интерфейс приложения iOS похож на онлайн-магазин — приложение обычно получает одно окно, но может заполнять его любым необходимым количеством объектов, а объекты и схемы упорядочения могут изменяться в зависимости от того, что приложение хочет отобразить.The user interface of an iOS app is like a storefront - the application typically gets one Window, but it can fill the Window up with as many objects at it needs, and the objects and arrangements can be changed depending on what the app wants to display. В этом сценарии объекты — то, что видит пользователь — называются представлениями.The objects in this scenario - the things that the user sees - are called Views. Чтобы создать один экран в приложении, представления располагаются друг над другом в виде иерархии представлений содержимого, а управляет такой иерархией отдельный контроллер представления.To build a single screen in an application, Views are stacked on top of each other in a Content View Hierarchy, and the hierarchy is managed by a single view controller. Приложения с несколькими экранами используют несколько иерархий представлений содержимого, каждая из которых имеет свой контроллер представления. Приложение размещает представления в окне, чтобы создать другую иерархию представлений содержимого в зависимости от экрана, на котором находится пользователь.Applications with multiple screens have multiple Content View Hierarchies, each with its own view controller, and the application places Views in the Window to create a different Content View Hierarchy based on the screen that the user is on.

В этом разделе подробно рассмотрен пользовательский интерфейс, а также описаны представления, иерархии представлений содержимого и конструктор iOS.This section dives into the user interface by describing Views, Content View Hierarchies, and the iOS Designer.

Конструктор iOS и раскадровкиiOS Designer and storyboards

Конструктор IOS — это визуальный инструмент для создания пользовательских интерфейсов в Xamarin.The iOS Designer is a visual tool for building user interfaces in Xamarin. Конструктор можно запустить, дважды щелкнув любой файл раскадровки (STORYBOARD). При этом будет открываться представление, похожее на следующий снимок экрана:The Designer can be launched by double-clicking on any Storyboard (.storyboard) file, which will open to a view that resembles the following screenshot:

Раскадровка — это файл, содержащий визуальные структуры для экранов нашего приложения, а также переходы и связи между экранами.A Storyboard is a file that contains the visual designs of our application’s screens as well as the transitions and relationships between the screens. Представление экрана приложения в раскадровке называется сценой.The representation of an application’s screen in a Storyboard is called a Scene. Каждая сцена представляет контроллер представления и управляемый им стек представлений (иерархия представлений содержимого).Each Scene represents a view controller and the stack of Views that it manages (Content View Hierarchy). При создании проекта Приложение одного представления из шаблона Visual Studio для Mac автоматически создает файл раскадровки с именем Main.storyboard и заполняет его одной сценой, как показано на снимке экрана ниже:When a new Single View Application project is created from a template, Visual Studio for Mac automatically generates a Storyboard file called Main.storyboard and populates it with a single Scene, as illustrated by the screenshot below:

С помощью черной полосы в нижней части экрана раскадровки можно выбрать контроллер представления для сцены.The black bar at the bottom of the Storyboard screen can be selected to choose the view controller for the Scene. Контроллер представления является экземпляром класса UIViewController, который содержит код резервирования для иерархии представлений содержимого.The view controller is an instance of the UIViewController class that contains the backing code for the Content View Hierarchy. Свойства в этом контроллере представления можно просмотреть и задать на Панели свойств, как показано на снимке экрана ниже:Properties on this view controller can be viewed and set inside the Properties Pad, as illustrated by the screenshot below:

Раскадровка — это файл, содержащий визуальные структуры для экранов нашего приложения, а также переходы и связи между экранами.A Storyboard is a file that contains the visual designs of our application’s screens as well as the transitions and relationships between the screens. Представление экрана приложения в раскадровке называется сценой.The representation of an application’s screen in a Storyboard is called a Scene. Каждая сцена представляет контроллер представления и управляемый им стек представлений (иерархия представлений содержимого).Each Scene represents a view controller and the stack of Views that it manages (Content View Hierarchy). При создании проекта Приложение одного представления из шаблона Visual Studio автоматически создает файл раскадровки с именем Main.storyboard и заполняет его одной сценой, как показано на снимке экрана ниже:When a new Single View Application project is created from a template, Visual Studio automatically generates a Storyboard file called Main.storyboard and populates it with a single Scene, as illustrated by the screenshot below:

С помощью полосы в нижней части экрана раскадровки можно выбрать контроллер представления для сцены.The bar at the bottom of the Storyboard screen can be selected to choose the view controller for the Scene. Контроллер представления является экземпляром класса UIViewController, который содержит код резервирования для иерархии представлений содержимого.The view controller is an instance of the UIViewController class that contains the backing code for the Content View Hierarchy. Свойства в этом контроллере представления можно просмотреть и задать в области свойств, как показано на снимке экрана ниже:Properties on this view controller can be viewed and set inside the Properties Pane, as illustrated by the screenshot below:

Представление можно выбрать, щелкнув внутри белой части сцены.The View can be selected by clicking inside the white part of the Scene. Представление является экземпляром класса UIView, который определяет область экрана и предоставляет интерфейсы для работы с содержимым в этой области.The View is an instance of the UIView class that defines an area of the screen and provides interfaces for working with the content in that area. Представлением по умолчанию является отдельное корневое представление, заполняющее весь экран устройства.The default View is a single Root View that fills the whole device screen.

Слева от сцены находится серая стрелка со значком флага, как показано на снимке экрана ниже:To the left of the Scene is a gray arrow with a flag icon, as illustrated by the screenshot below:

Эта стрелка представляет переход раскадровки, который также называют Segue (произносится "сег-вей").The gray arrow represents a storyboard transition called a Segue (pronounced “seg-way”). Так как этот переход не имеет источника, он называется переходом без источника (Sourceless Segue).Since this segue has no origin, it is called a Sourceless Segue. Переход без источника указывает на первую сцену, представления которой загружаются в окно приложения при запуске последнего.A sourceless segue points to the first scene whose views get loaded into the application's window at application startup. Первым, что пользователь видит при загрузке приложения, будет сцена и представления внутри нее.The scene and the views inside it will be the first thing that the user sees when the app loads.

При создании пользовательского интерфейса можно перетащить дополнительные представления с панели элементов на основное представление в области конструктора, как показано на снимке экрана ниже:When building a user interface, additional Views can be dragged from the Toolbox onto the main view on the design surface, as illustrated by the screenshot below:

Эти дополнительные представления называются вложенными.These additional Views are called Subviews. Вместе корневое представление и вложенные представления входят в состав иерархии представлений содержимого, управляемой ViewController.Together, the root view and subviews are part of a Content View Hierarchy that is managed by the ViewController. Расположение всех этих элементов на сцене можно просмотреть на панели Структура документа:The outline of all the elements in the scene can be viewed by examining it in the Document Outline pad:

Вложенные представления выделены на схеме ниже:The Subviews are highlighted in the diagram below:

Следующий раздел описывает иерархию представлений содержимого, представленную этой сценой.The next section breaks down the Content View Hierarchy represented by this Scene.

Иерархия представлений содержимогоContent view hierarchy

Иерархия представлений содержимого представляет собой стек представлений и вложенных представлений, управляемых одним отдельным контроллером представления, как показано на следующей схеме:A Content View Hierarchy is a stack of Views and Subviews managed by a single view controller, as illustrated by the diagram below:

Мы можем упростить просмотр иерархии представлений содержимого своего ViewController, временно изменив цвет фона корневого представления на желтый в разделе представления на Панели свойств, как показано на снимке экрана ниже:We can make the Content View Hierarchy of our ViewController easier to see by temporarily changing the background color of the root View to yellow in the View section of the Properties Pad, as illustrated by the screenshot below:

На следующей схеме показаны связи между окном, представлениями, вложенными представлениями и контроллером представления, которые позволяют вывести пользовательский интерфейс на экран устройства:The diagram below illustrates the relationships between the Window, Views, Subviews, and view controller that bring the user interface to the device screen:

Следующий раздел описывает работу с представлениями в коде, а также программирование взаимодействия с пользователем с помощью контроллеров представлений и жизненного цикла представлений.In the next section discusses how to work with Views in code and learn to program for user interaction using view controllers and the View lifecycle.

Контроллеры представлений и жизненный цикл представленияView controllers and the view lifecycle

Каждая иерархия представлений содержимого имеет соответствующий контроллер представления, обрабатывающий взаимодействие с пользователем.Every Content View Hierarchy has a corresponding view controller to power user interaction. Роль контроллера представления заключается в управлении представлениями в иерархии представлений содержимого.The role of the view controller is to manage the Views in the Content View Hierarchy. Контроллер представления не является частью иерархии представлений содержимого, а также элементом в интерфейсе.The view controller is not part of the Content View Hierarchy, and it's not an element in the interface. Вместо этого он предоставляет код, обрабатывающий взаимодействие пользователя с объектами на экране.Rather, it provides the code that powers the user's interactions with the objects on the screen.

Контроллеры представлений и раскадровкиView controllers and storyboards

На раскадровке контроллер представлен полосой в нижней части сцены.The view controller is represented in a Storyboard as a bar at the bottom of the Scene. При выборе контроллера представления его свойства отображаются на Панели свойств:Selecting the view controller brings up its properties in the Properties Pad:

Пользовательский класс контроллера представления для иерархии представлений содержимого, представленный этой сценой, можно задать, изменяя свойство Класс в разделе Удостоверение на панели свойств.A custom view controller class for the Content View Hierarchy represented by this Scene can be set by editing the Class property in the Identity section of the Properties Pad. Например, наше приложение Phoneword задает ViewController в качестве контроллера представления для первого экрана, как показано на снимке экрана ниже:For example, our Phoneword application sets the ViewController as the view controller for our first screen, as illustrated by the screenshot below:

На раскадровке контроллер представлен полосой в нижней части сцены.The view controller is represented in a Storyboard as a bar at the bottom of the Scene. При выборе контроллера представления его свойства отображаются на панели свойств:Selecting the view controller brings up its properties in the Properties Pane:

Пользовательский класс контроллера представления для иерархии представлений содержимого, представленный этой сценой, можно задать, изменяя свойство Класс в разделе Удостоверение на панели свойств.A custom view controller class for the Content View Hierarchy represented by this Scene can be set by editing the Class property in the Identity section of the Properties Pane. Например, наше приложение Phoneword задает ViewController в качестве контроллера представления для первого экрана, как показано на снимке экрана ниже:For example, our Phoneword application sets the ViewController as the view controller for our first screen, as illustrated by the screenshot below:

Это связывает представление раскадровки контроллера представления с классом ViewController C#.This links the Storyboard representation of the view controller to the ViewController C# class. Откройте файл ViewController.cs и обратите внимание, что контроллер представления является подклассом класса UIViewController, как показано в следующем коде:Open the ViewController.cs file and notice view controller is a subclass of UIViewController, as illustrated by the code below:

public partial class ViewController : UIViewController
{
    public ViewController (IntPtr handle) : base (handle)
    {

    }
}

Теперь ViewController управляет взаимодействием иерархии представлений содержимого, связанной с этим контроллером представления в раскадровке.The ViewController now drives the interactions of the content view hierarchy associated with this view controller in the storyboard. Далее вы узнаете о роли контроллера представления в управлении представлениями в рамках процесса, называемого жизненным циклом представления.Next you’ll learn about the view controller's role in managing the Views by introducing a process called the view lifecycle.

Примечание

Для экранов, служащих только для вывода визуальной информации и не требующих вмешательства пользователя, свойство Class на панели свойств можно не указывать.For visual-only screens that don’t require user interaction, the Class property can be left blank in the Properties Pad. При этом класс резервирования контроллера представления задается как реализация UIViewController по умолчанию, что удобно, если вы не планируете добавлять пользовательский код.This sets the view controller's backing class as the default implementation of a UIViewController, which is appropriate if you don’t plan on adding custom code.

Жизненный цикл представленияView lifecycle

Контроллер представления отвечает за загрузку иерархий представлений содержимого в окно и выгрузку их оттуда.The view controller is in charge of loading and unloading content view hierarchies from the window. Когда с представлением в иерархии представлений содержимого происходит что-то важное, операционная система уведомляет контроллер представления посредством событий в жизненном цикле представления.When something of importance happens to a view in the content view hierarchy, the operating system notifies the view controller through events in the view lifecycle. Переопределяя методы в жизненном цикле представления, вы можете взаимодействовать с объектами на экране и создавать динамический и быстродействующий пользовательский интерфейс.By overriding methods in the view lifecycle, you can interact with the objects on the screen and create a dynamic, responsive user interface.

Ниже представлены основные методы жизненного цикла и их функции:These are the basic lifecycle methods and their function:

  • ViewDidLoad — вызывается, когда контроллер представления впервые загружает свою иерархию представлений содержимого в память.ViewDidLoad - Called once the first time the view controller loads its Content View Hierarchy into memory. Он хорошо подходит для первоначальной настройки, так как именно здесь вложенные представления впервые становятся доступными в коде.This is a good place to do initial setup because it is when Subviews first become available in code.
  • ViewWillAppear — вызывается каждый раз, когда представление контроллера представления готовится к добавлению в иерархию представлений содержимого и отображается на экране.ViewWillAppear - Called every time a view controller's View is about to be added to a Content View Hierarchy and appear on the screen.
  • ViewWillDisappear — вызывается каждый раз, когда представление контроллера представления готовится к удалению из иерархии представлений содержимого и пропадает с экрана.ViewWillDisappear - Called every time a view controller's View is about to be removed from a Content View Hierarchy and disappear from the screen. Это событие жизненного цикла используется для очистки и сохранения состояния.This lifecycle event is used for cleanup and saving state.
  • ViewDidAppear и ViewDidDisappear — вызываются при добавлении представления в иерархию представлений содержимого и удалении его оттуда, соответственно.ViewDidAppear and ViewDidDisappear - Called when a View gets added or removed from the Content View Hierarchy, respectively.

При добавлении пользовательского кода на любом этапе жизненного цикла нужно переопределить базовую реализацию данного метода жизненного цикла.When custom code is added to any stage of the lifecycle, that lifecycle method’s base implementation must be overridden. Для этого можно использовать существующий метод жизненного цикла, который уже имеет определенный код, расширив его с помощью дополнительного кода.This is achieved by tapping into the existing lifecycle method, which has some code already attached to it, and extending it with additional code. Базовая реализация вызывается из метода для того, чтобы исходный код выполнялся перед добавленным вами новым кодом.The base implementation is called from inside the method to make sure the original code runs before the new code. Пример приведен в следующем разделе.An example of this is demonstrated in the next section.

Дополнительные сведения о работе с контроллерами представлений см. в руководстве по программированию контроллеров представлений для iOS и справочнике по UIViewController компании Apple.For more information on working with view controllers, refer to Apple's view controller Programming Guide for iOS and the UIViewController reference.

Реакция на действия пользователяResponding to user interaction

Наиболее важной ролью контроллера представления является реагирование на взаимодействие с пользователем, например нажатия кнопок, переходы между элементами и многое другое.The most important role of the view controller is responding to user interaction, such as button presses, navigation, and more. Взаимодействие с пользователем проще всего обрабатывать, предоставив элемент управления для прослушивания вводимых пользователем данных и подключив обработчик событий для реагирования на эти данные.The simplest way to handle user interaction is to wire up a control to listen to user input and attach an event handler to respond to the input. Например, кнопку можно настроить для реагирования на событие сенсорного ввода, как показано в приложении Phoneword.For example, a button could be wired up to respond to a touch event, as demonstrated in the Phoneword app.

Давайте рассмотрим, как это работает.Let's explore how this works. В проекте Phoneword_iOS в иерархию представлений содержимого была добавлена кнопка TranslateButton:In the Phoneword_iOS project, a button was added called TranslateButton to the Content View Hierarchy:

При назначении имени элементу управления Button на Панели свойств конструктор iOS автоматически сопоставил его с элементом управления в ViewController.designer.cs, сделав TranslateButton доступным в классе ViewController.When a Name is assigned to the Button control in the Properties Pad, the iOS designer automatically mapped it to a control in the ViewController.designer.cs, making the TranslateButton available inside the ViewController class. Впервые элементы управления становятся доступными на этапе ViewDidLoad жизненного цикла представления, поэтому этот метод жизненного цикла используется для реагирования на сенсорный ввод пользователя:Controls first become available in the ViewDidLoad stage of the View lifecycle, so this lifecycle method is used to respond to the user's touch:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    // wire up TranslateButton here
}

Приложение Phoneword использует событие сенсорного ввода TouchUpInside для прослушивания сенсорного ввода пользователя.The Phoneword app uses a touch event called TouchUpInside to listen to the user's touch. TouchUpInside прослушивает событие отрыва пальца от экрана, а затем события прикосновения к экрану в границах элемента управления.TouchUpInside listens for a touch up event (finger lifting off the screen) that follows a touch down (finger touching the screen) inside the bounds of the control. Противоположностью TouchUpInside является событие TouchDown, которое возникает, когда пользователь нажимает элемент управления.The opposite of TouchUpInside is the TouchDown event, which fires when the user presses down on a control. Событие TouchDown перехватывает много посторонних данных и не позволяет пользователю отменить касание, отведя палец за границу элемента управления.The TouchDown event captures a lot of noise and gives the user no option to cancel the touch by sliding their finger off the control. TouchUpInside является наиболее распространенным способом для реагирования на касание кнопки и обеспечивает процедуру взаимодействия, ожидаемую пользователем при нажатии кнопки.TouchUpInside is the most common way to respond to a Button touch and creates the experience the user expects when pressing a button. Дополнительные сведения об этом доступны в рекомендациях по работе с человеческим интерфейсом iOS компании Apple.More information on this is available in Apple’s iOS Human Interface Guidelines.

Приложение обрабатывало событие TouchUpInside с помощью лямбда-выражения, но вместо этого можно было использовать делегат или именованный обработчик событий.The app handled the TouchUpInside event with a lambda, but a delegate or a named event handler could have also been used. В конечной форме код элемента "Button" выглядит так:The final Button code resembled the following:

public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    string translatedNumber = "";

    TranslateButton.TouchUpInside += (object sender, EventArgs e) => {
      translatedNumber = Core.PhonewordTranslator.ToNumber(PhoneNumberText.Text);
      PhoneNumberText.ResignFirstResponder ();

      if (translatedNumber == "") {
        CallButton.SetTitle ("Call", UIControlState.Normal);
        CallButton.Enabled = false;
      } else {
        CallButton.SetTitle ("Call " + translatedNumber, UIControlState.Normal);
        CallButton.Enabled = true;
      }
  };
}

Дополнительные понятия, представленные в PhonewordAdditional concepts introduced in Phoneword

В приложении Phoneword представлено несколько понятий, не охваченных этим руководством.The Phoneword application introduced several concepts not covered in this guide. В их число входят следующие:These concepts include:

  • Изменение текста кнопки — приложение Phoneword продемонстрировало, как изменить текст элемента Button, вызвав SetTitle для Button и передав новый текст и состояние элемента управления Button.Change Button Text – The Phoneword app demonstrated how to change the text of a Button by calling SetTitle on the Button and passing in the new text and the Button’s Control State. Например, следующий код позволяет изменить текст CallButton на "Call" (Вызов):For example, the following code changes the CallButton’s text to “Call”:

    CallButton.SetTitle ("Call", UIControlState.Normal);
    
  • Включение и отключение кнопок — кнопки могут находиться в состоянии Enabled или Disabled.Enable and Disable ButtonsButtons can be in an Enabled or Disabled state. Отключенный элемент Button не реагирует на действия пользователя.A disabled Button won’t respond to user input. Например, в следующем коде отключается объект CallButton:For example, the following code disables the CallButton:

    CallButton.Enabled = false;
    

    Дополнительные сведения о кнопках см. в руководстве Кнопки.For more information on buttons, refer to the Buttons guide.

  • Убирание клавиатуры — когда пользователь касается текстового поля, iOS отображает клавиатуру, чтобы он мог ввести данные.Dismiss the Keyboard – When the user taps the Text Field, iOS displays the keyboard to let the user enter input. К сожалению, встроенная функция для убирания клавиатуры отсутствует.Unfortunately, there is no built-in functionality to dismiss the keyboard. Следующий код добавляется в TranslateButton, чтобы закрывать клавиатуру, когда пользователь нажимает TranslateButton:The following code is added to the TranslateButton to dismiss the keyboard when the user presses the TranslateButton:

    PhoneNumberText.ResignFirstResponder ();
    

    Еще один пример отмены клавиатуры см. в разделе Отмена клавиатуры.For another example of dismissing the keyboard, refer to the Dismiss the Keyboard recipe.

  • Выполнение телефонного вызова с URL-адресом — в приложении Phoneword используется схема URL-адресов Apple для запуска приложения телефонной системы.Place Phone Call with URL – In the Phoneword app, an Apple URL scheme is used to launch the system phone app. Пользовательская схема URL-адресов состоит из префикса "tel:" и преобразованного телефонного номера, как показано в следующем коде:The custom URL scheme consists of a “tel:” prefix and the translated phone number, as illustrated by the code below:

    var url = new NSUrl ("tel:" + translatedNumber);
    if (!UIApplication.SharedApplication.OpenUrl (url))
    {
        // show alert Controller
    }
    
  • Отображение оповещения — когда пользователь пытается выполнить телефонный вызов на устройстве, которое не поддерживает такие вызовы, например, в симуляторе или на iPod Touch, отображается диалоговое окно, оповещающее пользователя о невозможности телефонного вызова.Show an Alert – When a user tries to place a phone call on a device that doesn’t support calls – for example the simulator or an iPod Touch – an alert dialog is displayed to let the user know the phone call can’t be placed. Приведенный ниже код создает и заполняет контроллер оповещения:The code below creates and populates an alert controller:

    if (!UIApplication.SharedApplication.OpenUrl (url)) {
                    var alert = UIAlertController.Create ("Not supported", "Scheme 'tel:' is not supported on this device", UIAlertControllerStyle.Alert);
                    alert.AddAction (UIAlertAction.Create ("Ok", UIAlertActionStyle.Default, null));
                    PresentViewController (alert, true, null);
                }
    

    Дополнительные сведения о представлениях оповещений iOS см. в инструкции по контроллеру оповещений.For more information on iOS alert views, refer to the Alert Controller recipe.

Тестирование, развертывание и последние штрихиTesting, deployment, and finishing touches

Как Visual Studio для Mac, так и Visual Studio предоставляют множество возможностей для тестирования и развертывания приложения.Both Visual Studio for Mac and Visual Studio provide many options for testing and deploying an application. В этом разделе рассматриваются возможности отладки, демонстрируется тестирование приложения на устройстве и представлены инструменты для создания пользовательских значков приложения и изображений при запуске.This section covers debugging options, demonstrates testing applications on device, and introduces tools for creating custom app icons and launch images.

Средства отладкиDebugging tools

Иногда диагностика проблем в коде приложения может представлять трудность.Sometimes issues in application code are difficult to diagnose. Для выявления проблем в сложном коде можно устанавливать точки останова, выполнять код пошагово или выводить сведения в окне журнала.To help diagnose complex code issues, you could Set a Breakpoint, Step Through Code, or Output Information to the Log Window.

Развертывание на устройствоDeploy to a device

Симулятор iOS позволяет быстро протестировать приложение.The iOS Simulator is a quick way to test an application. Он имеет ряд полезных оптимизаций для тестирования, включая расположение макетов, имитацию перемещения и многое другое.The Simulator has a number of useful optimizations for testing, including mock location, simulating movement, and more. Однако пользователи будут работать с итоговым приложением не в симуляторе.However, users will not consume the final app in a Simulator. Все приложения следует с самого раннего этапа и регулярно протестировать на реальных устройствах.All applications should be tested on real devices early and often.

Устройству требуется время для подготовки, а также учетная запись разработчика Apple.A device takes time to provision and requires an Apple Developer Account. В руководстве Подготовка устройств приведены подробные инструкции по подготовке устройства к разработке.The Device Provisioning guide gives thorough instructions on getting a device ready for development.

Примечание

Сейчас, в связи с требованиями Apple, при создании кода для устройства или симулятора требуется сертификат разработки или удостоверение подписывания.At present, due to a requirement from Apple, it is necessary to have a development certificate or signing identity to build you code for device or simulator. Чтобы настроить их, следуйте указаниям в руководстве по подготовке устройств.Follow the steps in the Device Provisioning guide to set this up.

После подготовки устройство можно развернуть, подключив его, изменив целевой объект в панели инструментов сборки на устройство iOS и нажав кнопку Запустить (Воспроизвести), как показано на следующем снимке экрана:Once the device is provisioned, you can deploy to it by plugging it in, changing the target in the build toolbar to the iOS Device, and pressing Start ( Play) as illustrated by the following screenshot:

Приложение развертывается на устройстве iOS:The app will deploy to the iOS device:

Создание пользовательских значков и изображений, которые появляются при запускеGenerate custom icons and launch images

Не у всех есть конструктор для создания пользовательских значков и изображений при запуске, которые помогают приложению выделиться среди других. Ниже представлен ряд альтернативных средств для создания собственных изображений:Not everyone has a designer available to create the custom icons and launch images an app needs to stand out. Here are several alternate approaches to generating custom app artwork:

  • Sketch — приложение для Mac, предназначенное для разработки пользовательского интерфейса, значков и других компонентов.Sketch – Sketch is a Mac app for designing user interfaces, icons, and more. С помощью этого приложения создавались значки приложений и изображения при запуске для Xamarin.This is the app that was used to design the Xamarin App Icons and Launch Images set. Приложение Sketch 3 доступно в магазине App Store.Sketch 3 is available on the App Store. Вы также можете попробовать бесплатное средство Sketch.You can try out the free Sketch Tool as well.
  • Pixelmator — универсальный редактор изображений для Mac, который стоит приблизительно 30 USD.Pixelmator – A versatile image editing app for Mac that costs about $30.
  • Glyphish — готовые наборы значков высокого качества, которые можно скачать бесплатно или приобрести.Glyphish – High-quality prebuilt icon sets for free download and purchase.
  • Fiverr — воспользуйтесь услугами одного из дизайнеров по созданию набора значков по цене от 5 USD.Fiverr – Choose from a variety of designers to create an icon set for you, starting at $5. Результат может быть разным, однако это хороший ресурс, если вам нужно создать значки максимально быстро.Can be hit or miss but a good resource if you need icons designed on the fly
  • Visual Studio — создать простой набор значков для приложения можно непосредственно в интегрированной среде разработки.Visual Studio – You can use this to create a simple icon set for your app directly in the IDE.
  • Glyphish — готовые наборы значков высокого качества, которые можно скачать бесплатно или приобрести.Glyphish – High-quality prebuilt icon sets for free download and purchase.
  • Fiverr — воспользуйтесь услугами одного из дизайнеров по созданию набора значков по цене от 5 USD.Fiverr – Choose from a variety of designers to create an icon set for you, starting at $5. Результат может быть разным, однако это хороший ресурс, если вам нужно создать значки максимально быстро.Can be hit or miss but a good resource if you need icons designed on the fly

Дополнительные сведения о размерах значков изображений при запуске и требованиях к ним см. в руководстве по работе со значками.For more information about icon and launch image sizes and requirements, refer to the Working with Images guide.

СводкаSummary

Поздравляем!Congratulations! Теперь у вас должно быть ясное понимание того, из каких компонентов состоит приложение Xamarin.iOS и какие инструменты нужны для его создания.You now have a solid understanding of the components of a Xamarin.iOS application as well as the tools used to create them. В следующем руководстве из серии "Приступая к работе" вы расширите наше приложение, реализовав обработку нескольких экранов.In the next tutorial in the Getting Started series, you’ll extend our application to handle multiple screens. Попутно вы реализуете контроллер навигации, узнаете о переходах раскадровки, а также познакомитесь с шаблоном MVC.Along the way you’ll implement a Navigation Controller, learn about Storyboard Segues, and introduce the Model, View, Controller (MVC) pattern as you extend our application to handle multiple screens.