Когда разработчики задумываются о создании приложений Xamarin для устройств Apple, они часто имеют в виду iPhone и iPad, но ведь, помимо этого, можно создавать приложения и для macOS. Здесь все не в полной мере аналогично iOS, однако, применительно к тем, кто имеет опыт работы с iOS, надо сказать, что они уже обладают множеством навыков, которые могут быть успешно использованы при разработке приложений для macOS. Благодаря Xamarin.Mac разработчики могут создавать отличные приложения macOS с помощью простого кода C#.
Из этой статьи вы узнаете, как создать свое первое приложение для macOS на C#, а разрабатывать мы будем таймер Pomodoro для обеспечения продуктивности.
Приступаем
Создание приложений для macOS начинается с того же, с чего и любое другое приложение, то есть, с File > New. Обратите внимание на то, что на Ваше устройство macOS необходимо установить Xamarin.Mac.
Разработка приложений macOS из Visual Studio не поддерживается!
Следуем по пути: File > New Solution > Mac > App > Cocoa App
Далее необходимо ввести имя приложения; мы назовем его просто Pomodoro.
Параметры Dock Item и Extension можно настроить, но сейчас мы оставим их как есть — с пустыми значениями или установленными по умолчанию. Мы разберемся с ними в другой статье.
Теперь основа для приложения macOS заложена! Сейчас приложение можно протестировать, запустив его из левого верхнего края Xamarin Studio. В отличие от Xamarin.iOS, здесь не нужно выбирать целевой объект для запуска приложения, поскольку приложение будет запущено прямо на компьютере Mac. Вы должны увидеть что-то вроде этого:
Создание пользовательского интерфейса
Теперь, когда у нас есть основа приложения для macOS, пришло время построить пользовательский интерфейс, ведь от пустого приложения нет никакого проку!
В Xamarin.Mac для разработки пользовательского интерфейса используется Interface Builder от Xcode. Как и в iOS, интерфейсы macOS строятся с помощью Storyboard. Поддержка Storyboard на macOS была введена в версии 10.10 (Yosemite). Чтобы не усложнять статью, мы будем в данном случае рассматривать работу с версией macOS 10.10 и выше. Если приложение должно поддерживать 10, 9 или более низкие версии, необходимо использовать файлы .xib, о которых можно прочитать подробнее в руководстве по работе с файлами .xib.
В обозревателе решений дважды щелкните по пункту Main.storyboard. Xcode откроется автоматически со стабом проекта, а Storyboard будет открыт в конструкторе интерфейсов.
Первое, что мы увидим, — это пустой пользовательский интерфейс. Обратите внимание, что в Storyboard имеется строка меню и ее можно использовать для настройки строки меню у приложения. На данный момент давайте не будем ничего в меню изменять.
Добавление объектов к интерфейсу в некоторой степени похоже на использование конструктора iOS в Xamarin Studio. В правом нижнем углу окна конструктора интерфейса отображается панель инструментов. Можно просмотреть доступные объекты, выбрав значок «Показать библиотеку объектов» (Show the Object library), как показано ниже:
Можно просто перетащить представления на их контроллер. Для начала давайте сделаем интерфейс, подобный приведенному ниже, который состоит из метки и кнопки.
Для начала найдите объект Label, а затем перетащите его на контроллер представлений (View Controller).
Мы можем сделать то же самое для кнопки — Push Button.
Чтобы отредактировать заголовок и ярлык у кнопки, можно либо дважды щелкнуть мышью для редактирования текста, либо в инспекторе атрибутов (Attributes Inspector) в верхней правой части окна найти пункт Title и отредактировать его.
Теперь, когда пользовательский интерфейс создан, настало время настроить в коде команды и outlets для работы с ним. Для этого нужно переключиться на помощник редактора (Assistant Editor), который можно найти в верхней правой части главного окна Xcode, и щелкнуть на значок, который выглядит как два перекрывающихся круга. При этом автоматически создается файл с именем ViewController.h. Если этого не происходит, в верхней части новой панели редактора щелкните по Automatic и выберите Manual > Pomodoro > Pomodoro > ViewController.h. Теперь Xcode должен выглядеть следующим образом:
Настройка команд и outlet в файле заголовка (.h file) позволит нам ссылаться на них из проекта Xamarin. Чтобы при нажатии кнопки запускался код, мы должны настроить действие и ссылаться на метку (label) из проекта Xamarin, и, кроме того, нужно создать outlet.
Удерживая нажатой клавишу Control, нажмите на кнопку и перетащите курсор с нее на строку под заключительной закрывающей фигурной скобкой в правом редакторе. Во всплывающем окне измените Connection на Outlet, а имя укажите TimerLabel и нажмите «подключить»:
Таким образом файл заголовка автоматически заполнится правильным определением для outlet:
1 | @property (nonatomic, retain) IBOutlet NSTextField *TimerLabel; |
Повторите те же шаги для кнопки, на этот раз назвав ее StartStopButton.
Теперь нужно добавить команду для кнопки. Удерживая нажатой клавишу Control, щелкните и перетащите курсор также как раньше. На этот раз во всплывающем окне измените Connection на Action, а имя укажите StartStopButtonClicked и нажмите «подключить»:
По завершении должно получиться следующие определение:
1 2 3 | @property (nonatomic, retain) IBOutlet NSButton *StartStopButton; @property (nonatomic, retain) IBOutlet NSTextField *TimerLabel; - (IBAction)StartStopButtonClicked:(id)sender; |
На данный момент, это все, что нужно сделать с Xcode, поэтому теперь можно вернуться в Xamarin Studio, и изменения будут синхронизированы автоматически.
Добавление формы поведения к пользовательскому интерфейсу
Вернувшись в Xamarin Studio, откройте файл ViewController.cs. Теперь можно добавить код для кнопки, которая была создана в Xcode.
Добавьте следующие свойства:
1 2 | Timer MainTimer; int TimeLeft = 1500; // 1500 секунд в 25 минутах |
Затем в ViewDidLoad добавьте следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // Вызываем таймер каждую секунду MainTimer = new Timer(1000); MainTimer.Elapsed += (sender, e) => { TimeLeft--; // Форматируем время для метки TimeSpan time = TimeSpan.FromSeconds(TimeLeft); string timeString = time.ToString(@"mm\:ss"); InvokeOnMainThread(() => { // Мы хотим взаимодействовать с пользовательским интерфейсом из другого потока, // поэтому мы должны вызвать это изменение в основном потоке TimerLabel.StringValue = timeString; }); // Если прошло 25 минут if (TimeLeft == 0) { // Stop the timer and reset MainTimer.Stop(); TimeLeft = 1500; InvokeOnMainThread(() => { // Сбрасываем знаечния в UI TimerLabel.StringValue = "25:00"; StartStopButton.Title = "Start"; NSAlert alert = new NSAlert(); // Устанавливаем стиль и текст сообщения alert.AlertStyle = NSAlertStyle.Informational; alert.MessageText = "25 Minutes elapsed! Take a 5 minute break."; // Отображение NSAlert из текущего представления alert.BeginSheet(View.Window); }); } }; |
Наконец, нужен код, который будет запускаться при нажатии кнопки (мы установили команду для этого ранее):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | partial void StartStopButtonClicked(NSObject sender) { // Если таймер запущен, останавливаем его, // в противном случае запускаем if (MainTimer.Enabled) { MainTimer.Stop(); StartStopButton.Title = "Start"; } else { MainTimer.Start(); StartStopButton.Title = "Stop"; } } |
Теперь у нас есть базовый таймер Pomodoro! Когда приложение запущено, можно нажать кнопку, чтобы включить таймер обратного отсчета:
По истечении 25 минут будет показано оповещение:
Итог
Программа Xamarin.Mac является отличным инструментом для разработки мощных приложений под macOS, которые используют весь потенциал C#. Только что мы создали базовый таймер Pomodoro для macOS. Если вы хотите узнать больше о Xamarin.Mac, ознакомьтесь с материалами, а также примите участие в обсуждениях на форуме! Готовый код, который был использован в этой статье, можно найти на GitHub.
Источник: Официальный блог Xamarin
Написать ответ