Краткое руководство по приложению "Привет, iOS"

Предупреждение

Поддержка конструктора iOS была прекращена в Visual Studio 2019 версии 16.8 и Visual Studio 2019 для Mac версии 8.8. В Visual Studio 2019 версии 16.9 и Visual Studio для Mac версии 8.9 этот конструктор удален. Создавать пользовательские интерфейсы iOS рекомендуется непосредственно на Mac с помощью Xcode Interface Builder. Дополнительные сведения см. в статье Проектирование пользовательских интерфейсов с помощью Xcode.

Это руководство описывает создание приложения, которое преобразует введенный пользователем буквенно-цифровой телефонный номер в числовой телефонный номер и затем набирает его. Окончательный вариант приложения выглядит примерно так:

Приложение краткого руководства по Hello.iOS

Требования

Для разработки на iOS с помощью Xamarin требуется следующее:

  • Компьютер Mac под управлением macOS High Sierra 10.13 или последующей версии.
  • Последняя версия Xcode и пакета SDK iOS из App Store.

Xamarin.iOS работает со следующими конфигурациями:

  • Последняя версия Visual Studio для Mac, удовлетворяющая указанным выше требованиям.

Пошаговые инструкции по установке см. в руководстве по установке Xamarin.iOS на Mac.

Xamarin.iOS работает со следующими конфигурациями:

  • Последняя версия Visual Studio 2019 или Visual Studio 2017 Community, Professional или Enterprise на базе Windows 10 или более поздней версии, связанная с узлом сборки Mac, удовлетворяющим указанным выше требованиям.

Пошаговые инструкции по установке см. в руководстве по установке Xamarin.iOS в Windows.

Перед началом работы скачайте набор значков приложения Xamarin.

Пошаговое руководство по Visual Studio для Mac

Это пошаговое руководство описывает создание приложения Phoneword, которое преобразует буквенно-цифровой телефонный номер в числовой.

  1. Запустите Visual Studio для Mac из папки Applications (Приложения) или из Spotlight:

    Экран запуска

    На экране запуска нажмите кнопку Новый проект... , чтобы создать новое решение Xamarin.iOS:

    Решение iOS

  2. В диалоговом окне "Новое решение" выберите шаблон приложения единого представления приложения > iOS>, гарантируя выбор C# . Щелкните Далее.

    Выбор приложения одного представления

  3. Настройте приложение. Присвойте ему имяPhoneword_iOS, а для остальных параметров сохраните значения по умолчанию. Щелкните Далее.

    Ввод имени приложения

  4. Оставьте имеющееся имя для проекта и решения. Выберите расположение проекта или оставьте значение по умолчанию:

    Выбор расположения проекта

  5. Нажмите кнопку Создать, чтобы создать Решение.

  6. Откройте файл Main.storyboard, дважды щелкнув его на Панели решения. Убедитесь, что файл открыт с помощью конструктора iOS Visual Studio (щелкните правой кнопкой мыши раскадровки и выберите "Открыть с помощью > конструктора iOS"). Это позволяет создавать пользовательский интерфейс визуально:

    Конструктор iOS

    Обратите внимание на то, что классы размера включены по умолчанию. Чтобы узнать о них подробнее, см. руководство по унифицированным раскадровкам.

  7. Откройте панель элементов, введите "метка" в поле поиска и перетащите элемент Метка в область конструктора (в центре):

    Перетаскивание элемента

    Примечание.

    Вы можете открыть панель свойств или панель элементов в любое время, перейдя к панели просмотра>.

  8. Используя маркеры перетаскивания элементов управления (кружки вокруг элемента управления), сделайте метку шире:

    Увеличение ширины метки

  9. Выбрав элемент Метка в области конструктора, используйте Панель свойств, чтобы изменить свойство Текст элемента Метка на "Enter a Phoneword" (Введите слово-номер):

    Установка метки для ввода слова-номера

  10. Выполните поиск строки "текстовое поле" на панели элементов и перетащите элемент Текстовое поле с панели элементов в область конструктора, поместив его под элементом Метка. Измените ширину, чтобы элемент Текстовое поле был такой же ширины, что и Метка:

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

  11. Выбрав элемент Текстовое поле в области конструктора, измените для текстового поля свойство Имя в разделе "Удостоверение" на панели свойств, указав новое значение PhoneNumberText, а для свойства Текст введите "1-855-XAMARIN":

    Изменение значения свойства

  12. Перетащите элемент Кнопка из панели элементов в область конструктора и поместите его под элементом Текстовое поле. Настройте ширину элемента Кнопка, чтобы выровнять его с элементами Текстовое поле и Метка:

    Настройка ширины элемента

  13. Выбрав элемент Кнопка в области конструктора, измените свойство Имя в разделе УдостоверениеПанели свойств на TranslateButton. Измените значение свойства Заголовок на "Translate" (Преобразовать):

    Изменение значения свойства

  14. Повторите два предыдущих действия, перетащите элемент Кнопка из панели элементов в область конструктора и поместите его под первым элементом Кнопка. Настройте ширину элемента Кнопка, чтобы выровнять его с первым элементом Кнопка:

    Настройка ширины элемента

  15. Выбрав второй элемент Кнопка в области конструктора, измените свойство Имя в разделе УдостоверениеПанели свойств на CallButton. Измените значение свойства Заголовок на "Call" (Вызов):

    Изменение значения свойства

    Сохраните изменения, перейдя к файлу >сохранения или нажав клавиши ctrl + s.

  16. В приложение нужно добавить логику для преобразования телефонных номеров из буквенно-цифровых в цифровые. Добавьте новый файл в проект, щелкнув правой кнопкой мыши проект Телефон word_iOS на панели решения и выбрав "Добавить > новый файл" или нажав клавиши " + n:

    Добавление нового файла в проект

  17. В диалоговом окне "Новый файл" выберите "Общий > пустой класс" и назовите новый файлPhoneTranslator:

    Выбор параметра

  18. Создается пустой класс C#. Удалите код шаблона и замените его следующим:

    using System.Text;
    using System;
    
    namespace Phoneword_iOS
    {
        public static class PhoneTranslator
        {
            public static string ToNumber(string raw)
            {
                if (string.IsNullOrWhiteSpace(raw)) {
                    return "";
                } else {
                    raw = raw.ToUpperInvariant();
                }
    
                var newNumber = new StringBuilder();
                foreach (var c in raw)
                {
                    if (" -0123456789".Contains(c)) {
                        newNumber.Append(c);
                    } else {
                        var result = TranslateToNumber(c);
                        if (result != null) {
                            newNumber.Append(result);
                        }
                    }
                    // otherwise we've skipped a non-numeric char
                }
                return newNumber.ToString();
            }
    
            static bool Contains (this string keyString, char c)
            {
                return keyString.IndexOf(c) >= 0;
            }
    
            static int? TranslateToNumber(char c)
            {
                if ("ABC".Contains(c)) {
                    return 2;
                } else if ("DEF".Contains(c)) {
                    return 3;
                } else if ("GHI".Contains(c)) {
                    return 4;
                } else if ("JKL".Contains(c)) {
                    return 5;
                } else if ("MNO".Contains(c)) {
                    return 6;
                } else if ("PQRS".Contains(c)) {
                    return 7;
                } else if ("TUV".Contains(c)) {
                    return 8;
                } else if ("WXYZ".Contains(c)) {
                    return 9;
                }
                return null;
            }
        }
    }
    

    Сохраните файл PhoneTranslator.cs и закройте его.

  19. Добавьте код для подключения пользовательского интерфейса. Для этого дважды щелкните файл ViewController.cs на Панели решения, чтобы открыть его:

    Добавление кода для подключения пользовательского интерфейса

  20. Начните с подключения TranslateButton. Найдите метод ViewDidLoad в классе ViewController и добавьте следующий код под вызовом base.ViewDidLoad():

    string translatedNumber = "";
    
    TranslateButton.TouchUpInside += (object sender, EventArgs e) => {
        // Convert the phone number with text to a number
        // using PhoneTranslator.cs
        translatedNumber = PhoneTranslator.ToNumber(
            PhoneNumberText.Text);
    
        // Dismiss the keyboard if text field was tapped
        PhoneNumberText.ResignFirstResponder ();
    
        if (translatedNumber == "") {
            CallButton.SetTitle ("Call ", UIControlState.Normal);
            CallButton.Enabled = false;
        } else {
            CallButton.SetTitle ("Call " + translatedNumber,
                UIControlState.Normal);
            CallButton.Enabled = true;
        }
    };
    

    Включите using Phoneword_iOS;, если пространство имен файла отличается.

  21. Добавьте код, реагирующий на нажатие пользователем второй кнопки, которая называется CallButton. Поместите следующий код после кода для TranslateButton и добавьте using Foundation; в начало файла:

        CallButton.TouchUpInside += (object sender, EventArgs e) => {
            // Use URL handler with tel: prefix to invoke Apple's Phone app...
            var url = new NSUrl ("tel:" + translatedNumber);
    
            // ...otherwise show an alert dialog
            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);
            }
        };
    
  22. Сохраните изменения, а затем создайте приложение, выбрав "Построить > все " или нажав клавишу " " + B". Если приложение компилируется, в верхней части интегрированной среды разработки появится сообщение об успешном выполнении:

    Отображение сообщения об успешном выполнении в верхней части интегрированной среды разработки

    При наличии ошибок просмотрите предыдущие шаги и исправьте все ошибки, пока сборка приложения не будет проходить успешно.

  23. Наконец, протестируйте приложение в симуляторе iOS. В верхнем левом углу интегрированной среды разработки выберите значение Отладка в первом раскрывающемся списке и iPhone XR iOS 12.0 или другой доступный симулятор во втором, а затем нажмите кнопку Запустить (треугольная кнопка, которая напоминает кнопку воспроизведения):

    Выберите симулятор и нажмите

    Примечание.

    Сейчас, в связи с требованиями Apple, при создании кода для устройства или симулятора может потребоваться сертификат разработки или удостоверение подписывания. Чтобы настроить их, следуйте указаниям в руководстве по подготовке устройств.

  24. В результате приложение запускается в симуляторе iOS:

    Выполнение приложения в симуляторе iOS

    Симулятор iOS не поддерживает телефонные звонки; при попытке выполнить вызов отображается диалоговое окно предупреждения:

    Диалоговое окно предупреждения при попытке выполнения вызова

Пошаговое руководство по Visual Studio

Это пошаговое руководство описывает создание приложения Phoneword, которое преобразует буквенно-цифровой телефонный номер в числовой.

Примечание.

В этом пошаговом руководстве используется Visual Studio Enterprise 2017 на виртуальной машине Windows 10. Ваша конфигурация может отличаться при условии соблюдения приведенных выше требований, но имейте в виду, что некоторые снимки экрана могут отличаться от вашей конфигурации.

Примечание.

Прежде чем продолжить работу с пошаговым руководством, вам нужно подключиться к компьютеру Mac из Visual Studio. Это вызвано тем, что Xamarin.iOS использует инструменты Apple при сборке и запуске приложений. Настройка описана в инструкциях из руководства по связыванию с компьютером Mac.

  1. Запустите Visual Studio из меню Пуск:

    Начальный экран

    Создайте новое решение Xamarin.iOS, выбрав файл > нового > проекта... > Visual C# > i Телефон & iPad iOS > App (Xamarin):

    Выберите тип проекта приложения iOS (Xamarin)

    В следующем диалоговом окне выберите шаблон Приложение с одним представлением и нажмите OK, чтобы создать проект:

    Выберите шаблон проекта с одним представлением

  2. Убедитесь, что значок агента Mac Xamarin на панели инструментов отображается зеленым цветом.

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

    Если это не так, то есть отсутствует подключение к компьютеру сборки Mac, выполните инструкции из руководства по выбору конфигурации, чтобы настроить подключение.

  3. Откройте файл Main.storyboard в конструкторе iOS, дважды щелкнув его в обозревателе решений:

    Конструктор iOS

  4. Откройте вкладку Панель элементов, введите "метка" в поле поиска и перетащите элемент Метка в область конструктора (в центре):

    Перетаскивание элемента

  5. Захватите маркеры перетаскивания и растяните метку в стороны:

    Увеличение ширины метки

  6. Выбрав элемент Метка в области конструктора, используйте окна свойств, чтобы изменить свойство Текст элемента Метка на "Enter a Phoneword" (Введите слово-номер):

    Изменение свойства Text метки на ввод Телефон word

    Примечание.

    Вы можете открыть Свойства или Панель элементов в любое время. Для этого перейдите в меню Вид.

  7. Выполните поиск строки "текстовое поле" на панели элементов и перетащите элемент Текстовое поле с панели элементов в область конструктора, поместив его под элементом Метка. Измените ширину, чтобы элемент Текстовое поле был такой же ширины, что и Метка:

    Настройка ширины элемента

  8. Выбрав элемент Текстовое поле в области конструктора, измените егосвойствоИмя в разделе "Удостоверение" свойств на PhoneNumberText, а также измените свойство Текст на "1-855-XAMARIN":

    Изменение значения свойства

  9. Перетащите элемент Кнопка из панели элементов в область конструктора и поместите его под элементом Текстовое поле. Настройте ширину элемента Кнопка, чтобы выровнять его с элементами Текстовое поле и Метка:

    Настройка ширины элемента

  10. Выбрав элемент Кнопка в области конструктора, измените свойство Имя в разделе Удостоверениесвойств на TranslateButton. Измените значение свойства Заголовок на "Translate" (Преобразовать):

    Изменение значения свойства

  11. Повторите два предыдущих действия, перетащите элемент Кнопка из панели элементов в область конструктора и поместите его под первым элементом Кнопка. Настройте ширину элемента Кнопка, чтобы выровнять его с первым элементом Кнопка:

    Настройка ширины элемента

  12. Выбрав второй элемент Кнопка в области конструктора, измените свойство Имя в разделе Удостоверениесвойств на CallButton. Измените значение свойства Заголовок на "Call" (Вызов):

    Изменение значения свойства

    Сохраните изменения, перейдя к файлу >"Сохранить все" или нажав клавиши CTRL+s.

  13. Добавьте код, который преобразует телефонные номера из буквенно-цифровой записи в цифровую. Для этого сначала добавьте новый файл в проект, щелкнув правой кнопкой мыши проект Телефон word в Обозреватель решений и нажав > клавиши CTRL+SHIFT+A:

    Добавьте код, который преобразует телефонные номера из буквенно-цифровой записи в цифровую

  14. В диалоговом окне "Добавить новый элемент" (щелкните проект правой кнопкой мыши, выберите "Добавить > новый элемент..."), выберите класс Apple > и назовите новый файлPhoneTranslator:

    Добавление нового класса с именем PhoneTranslator

    Внимание

    Убедитесь, что выбран шаблон класса, в значке которого указан C#. В противном случае ссылка на этот класс может быть невозможна.

  15. Создается класс C#. Удалите код шаблона и замените его следующим:

    using System.Text;
    using System;
    
    namespace Phoneword
    {
        public static class PhoneTranslator
        {
            public static string ToNumber(string raw)
            {
                if (string.IsNullOrWhiteSpace(raw)) {
                    return "";
                } else {
                    raw = raw.ToUpperInvariant();
                }
    
                var newNumber = new StringBuilder();
                foreach (var c in raw)
                {
                    if (" -0123456789".Contains(c)) {
                        newNumber.Append(c);
                    } else {
                        var result = TranslateToNumber(c);
                        if (result != null) {
                            newNumber.Append(result);
                        }
                    }
                    // otherwise we've skipped a non-numeric char
                }
                return newNumber.ToString();
            }
    
            static bool Contains (this string keyString, char c)
            {
                return keyString.IndexOf(c) >= 0;
            }
    
            static int? TranslateToNumber(char c)
            {
                if ("ABC".Contains(c)) {
                    return 2;
                } else if ("DEF".Contains(c)) {
                    return 3;
                } else if ("GHI".Contains(c)) {
                    return 4;
                } else if ("JKL".Contains(c)) {
                    return 5;
                } else if ("MNO".Contains(c)) {
                    return 6;
                } else if ("PQRS".Contains(c)) {
                    return 7;
                } else if ("TUV".Contains(c)) {
                    return 8;
                } else if ("WXYZ".Contains(c)) {
                    return 9;
                }
                return null;
            }
        }
    }
    

    Сохраните файл PhoneTranslator.cs и закройте его.

  16. Дважды щелкните файл ViewController.cs в обозревателе решений, чтобы открыть его и добавить логику, обрабатывающую взаимодействие с кнопками:

    Добавление логики для обработки взаимодействия с кнопками

  17. Начните с подключения TranslateButton. В классе ViewController найдите метод ViewDidLoad. Добавьте следующий код кнопки внутрь ViewDidLoad, под вызовом base.ViewDidLoad():

    string translatedNumber = "";
    
    TranslateButton.TouchUpInside += (object sender, EventArgs e) => {
    
        // Convert the phone number with text to a number
        // using PhoneTranslator.cs
        translatedNumber = PhoneTranslator.ToNumber(PhoneNumberText.Text);
    
        // Dismiss the keyboard if text field was tapped
        PhoneNumberText.ResignFirstResponder ();
    
        if (translatedNumber == "") {
            CallButton.SetTitle ("Call", UIControlState.Normal);
            CallButton.Enabled = false;
            }
        else {
            CallButton.SetTitle ("Call " + translatedNumber, UIControlState.Normal);
            CallButton.Enabled = true;
            }
    };
    

    Включите using Phoneword;, если пространство имен файла отличается.

  18. Добавьте код, реагирующий на нажатие пользователем второй кнопки, которая называется CallButton. Поместите следующий код после кода для TranslateButton и добавьте using Foundation; в начало файла:

    CallButton.TouchUpInside += (object sender, EventArgs e) => {
        var url = new NSUrl ("tel:" + translatedNumber);
    
            // Use URL handler with tel: prefix to invoke Apple's Phone app,
            // otherwise show an alert dialog
    
        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);
                    }
    };
    
  19. Сохраните изменения, а затем создайте приложение, выбрав "Построить решение сборки>" или нажав клавиши CTRL+SHIFT+B. Если приложение компилируется, сообщение об успешном выполнении появится в нижней части интегрированной среды разработки:

    Отображение сообщения об успешном выполнении в нижней части интегрированной среды разработки

    При наличии ошибок просмотрите предыдущие шаги и исправьте все ошибки, пока сборка приложения не будет проходить успешно.

  20. Наконец, протестируйте приложение в удаленном симуляторе iOS. На панели инструментов интегрированной среды разработки выберите Отладка и iPhone 8 Plus iOS x.x в раскрывающихся меню и щелкните значок Запустить (зеленый треугольник, похожий на кнопку воспроизведения):

    Нажатие кнопки

  21. В результате приложение запускается в симуляторе iOS:

    Выполнение приложения в симуляторе iOS

    Симулятор iOS не поддерживает телефонные звонки; при попытке выполнить вызов отображается диалоговое окно предупреждения:

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

Поздравляем! Вы создали свое первое приложение Xamarin.iOS!

Пришло время закрепить и углубить приобретенные знания и навыки с помощью раздела Привет, iOS: теперь подробнее.