Работа с оповещениями tvOS в Xamarin

В этой статье рассматривается работа с UIAlertController для отображения сообщения оповещения пользователю в Xamarin.tvOS.

Если вам нужно привлечь внимание пользователя tvOS или попросить разрешение на деструктивное действие (например, удаление файла), вы можете представить сообщение оповещения с помощью UIAlertViewController:

Пример UIAlertViewController

В дополнение к отображению сообщения можно добавить кнопки и текстовые поля в оповещение, чтобы разрешить пользователю реагировать на действия и предоставлять отзывы.

Сведения об оповещениях

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

Пример оповещения

Apple предлагает следующие предложения по работе с оповещениями:

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

Названия оповещений и сообщения

Apple предлагает следующие предложения для представления заголовка оповещения и необязательного сообщения:

  • Используйте многословные заголовки . Заголовок оповещения должен получить точку ситуации явно, пока остается простой. Один заголовок слова редко предоставляет достаточно информации.
  • Используйте описательные заголовки, которые не требуют сообщения . По возможности рекомендуется сделать заголовок оповещения достаточно описательным, чтобы необязательный текст сообщения не требуется.
  • Сделайте сообщение коротким, полным предложением . Если необязательное сообщение необходимо для получения точки оповещения по всему, сохраните его как можно проще и сделайте его полным предложением с правильной прописной буквой и препинанием.

Кнопки оповещений

Apple предлагает добавить кнопки в оповещение:

  • Ограничение до двух кнопок. По возможности ограничьте оповещение не более двух кнопок . Оповещения одной кнопки предоставляют сведения, но не выполняют никаких действий. Два оповещения кнопки предоставляют простое действие "да/нет".
  • Используйте succinct, логические заголовки кнопки — простой один к двум заголовкам кнопки , которые четко описывают действие кнопки лучше всего. Дополнительные сведения см. в документации по работе с кнопками .
  • Четко помечайте разрушительные кнопки — для кнопок , выполняющих деструктивное действие (например, удаление файла), четко помечайте их стилем UIAlertActionStyle.Destructive .

Отображение предупреждения

Чтобы отобразить оповещение, создайте экземпляр UIAlertViewController и настройте его, добавив действия (кнопки) и выбрав стиль оповещения. Например, следующий код отображает оповещение OK/Cancel:

const string title = "A Short Title is Best";
const string message = "A message should be a short, complete sentence.";
const string acceptButtonTitle = "OK";
const string cancelButtonTitle = "Cancel";
const string deleteButtonTitle = "Delete";
...

var alertController = UIAlertController.Create (title, message, UIAlertControllerStyle.Alert);

// Create the action.
var acceptAction = UIAlertAction.Create (acceptButtonTitle, UIAlertActionStyle.Default, _ =>
    Console.WriteLine ("The \"OK/Cancel\" alert's other action occurred.")
);

var cancelAction = UIAlertAction.Create (cancelButtonTitle, UIAlertActionStyle.Cancel, _ =>
    Console.WriteLine ("The \"OK/Cancel\" alert's other action occurred.")
);

// Add the actions.
alertController.AddAction (acceptAction);
alertController.AddAction (cancelAction);
PresentViewController (alertController, true, null);

Давайте подробно рассмотрим этот код. Сначала мы создадим новое оповещение с заданным заголовком и сообщением:

UIAlertController.Create (title, message, UIAlertControllerStyle.Alert)

Затем для каждой кнопки, которую мы хотим отобразить в оповещении, мы создадим действие, определяющее заголовок кнопки, его стиль и действие, которое мы хотим предпринять, если кнопка нажимается:

UIAlertAction.Create ("Button Title", UIAlertActionStyle.Default, _ =>
    // Do something when the button is pressed
    ...
);

Перечисление UIAlertActionStyle позволяет задать стиль кнопки как одно из следующих:

  • По умолчанию кнопка будет кнопкой по умолчанию , выбранной при отображении оповещения.
  • Отмена . Кнопка является кнопкой отмены для оповещения.
  • Деструктивное — выделяет кнопку как деструктивное действие, например удаление файла. В настоящее время tvOS отображает деструктивную кнопку с красным фоном.

Этот AddAction метод добавляет заданное действие UIAlertViewController в метод и, наконец, PresentViewController (alertController, true, null) метод отображает заданное оповещение пользователю.

Добавление текстовых полей

Помимо добавления действий (кнопок) в оповещение, можно добавить текстовые поля в оповещение, чтобы разрешить пользователю заполнять такие сведения, как идентификаторы пользователей и пароли:

Текстовое поле в оповещении

Если пользователь выбирает текстовое поле, отображается стандартная клавиатура tvOS, позволяющая им ввести значение для поля:

Ввод текста

В следующем коде отображается оповещение OK/Cancel с одним текстовым полем для ввода значения:

UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);
UITextField field = null;

// Add and configure text field
alert.AddTextField ((textField) => {
    // Save the field
    field = textField;

    // Initialize field
    field.Placeholder = placeholder;
    field.Text = text;
    field.AutocorrectionType = UITextAutocorrectionType.No;
    field.KeyboardType = UIKeyboardType.Default;
    field.ReturnKeyType = UIReturnKeyType.Done;
    field.ClearButtonMode = UITextFieldViewMode.WhileEditing;

});

// Add cancel button
alert.AddAction(UIAlertAction.Create("Cancel",UIAlertActionStyle.Cancel,(actionCancel) => {
    // User canceled, do something
    ...
}));

// Add ok button
alert.AddAction(UIAlertAction.Create("OK",UIAlertActionStyle.Default,(actionOK) => {
    // User selected ok, do something
    ...
}));

// Display the alert
controller.PresentViewController(alert,true,null);

Метод AddTextField добавляет новое текстовое поле в оповещение, которое затем можно настроить, задав свойства, такие как замещающий текст (текст, который отображается при пустом поле), текстовое значение по умолчанию и тип клавиатуры. Например:

// Initialize field
field.Placeholder = placeholder;
field.Text = text;
field.AutocorrectionType = UITextAutocorrectionType.No;
field.KeyboardType = UIKeyboardType.Default;
field.ReturnKeyType = UIReturnKeyType.Done;
field.ClearButtonMode = UITextFieldViewMode.WhileEditing;

Чтобы мы могли работать с значением текстового поля позже, мы также сохраняем копию следующего кода:

UITextField field = null;
...

// Add and configure text field
alert.AddTextField ((textField) => {
    // Save the field
    field = textField;
    ...
});

После ввода значения в текстовое поле пользователь может использовать field переменную для доступа к такому значению.

Вспомогательный класс контроллера представления оповещений

Так как отображение простых распространенных типов оповещений UIAlertViewController может привести к довольно немного дубликата кода, вы можете использовать вспомогательный класс для уменьшения объема повторяющегося кода. Например:

using System;
using Foundation;
using UIKit;
using System.CodeDom.Compiler;

namespace UIKit
{
    /// <summary>
    /// Alert view controller is a reusable helper class that makes working with <c>UIAlertViewController</c> alerts
    /// easier in a tvOS app.
    /// </summary>
    public class AlertViewController
    {
        #region Static Methods
        public static UIAlertController PresentOKAlert(string title, string description, UIViewController controller) {
            // No, inform the user that they must create a home first
            UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);

            // Configure the alert
            alert.AddAction(UIAlertAction.Create("OK",UIAlertActionStyle.Default,(action) => {}));

            // Display the alert
            controller.PresentViewController(alert,true,null);

            // Return created controller
            return alert;
        }

        public static UIAlertController PresentOKCancelAlert(string title, string description, UIViewController controller, AlertOKCancelDelegate action) {
            // No, inform the user that they must create a home first
            UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);

            // Add cancel button
            alert.AddAction(UIAlertAction.Create("Cancel",UIAlertActionStyle.Cancel,(actionCancel) => {
                // Any action?
                if (action!=null) {
                    action(false);
                }
            }));

            // Add ok button
            alert.AddAction(UIAlertAction.Create("OK",UIAlertActionStyle.Default,(actionOK) => {
                // Any action?
                if (action!=null) {
                    action(true);
                }
            }));

            // Display the alert
            controller.PresentViewController(alert,true,null);

            // Return created controller
            return alert;
        }

        public static UIAlertController PresentDestructiveAlert(string title, string description, string destructiveAction, UIViewController controller, AlertOKCancelDelegate action) {
            // No, inform the user that they must create a home first
            UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);

            // Add cancel button
            alert.AddAction(UIAlertAction.Create("Cancel",UIAlertActionStyle.Cancel,(actionCancel) => {
                // Any action?
                if (action!=null) {
                    action(false);
                }
            }));

            // Add ok button
            alert.AddAction(UIAlertAction.Create(destructiveAction,UIAlertActionStyle.Destructive,(actionOK) => {
                // Any action?
                if (action!=null) {
                    action(true);
                }
            }));

            // Display the alert
            controller.PresentViewController(alert,true,null);

            // Return created controller
            return alert;
        }

        public static UIAlertController PresentTextInputAlert(string title, string description, string placeholder, string text, UIViewController controller, AlertTextInputDelegate action) {
            // No, inform the user that they must create a home first
            UIAlertController alert = UIAlertController.Create(title, description, UIAlertControllerStyle.Alert);
            UITextField field = null;

            // Add and configure text field
            alert.AddTextField ((textField) => {
                // Save the field
                field = textField;

                // Initialize field
                field.Placeholder = placeholder;
                field.Text = text;
                field.AutocorrectionType = UITextAutocorrectionType.No;
                field.KeyboardType = UIKeyboardType.Default;
                field.ReturnKeyType = UIReturnKeyType.Done;
                field.ClearButtonMode = UITextFieldViewMode.WhileEditing;

            });

            // Add cancel button
            alert.AddAction(UIAlertAction.Create("Cancel",UIAlertActionStyle.Cancel,(actionCancel) => {
                // Any action?
                if (action!=null) {
                    action(false,"");
                }
            }));

            // Add ok button
            alert.AddAction(UIAlertAction.Create("OK",UIAlertActionStyle.Default,(actionOK) => {
                // Any action?
                if (action!=null && field !=null) {
                    action(true, field.Text);
                }
            }));

            // Display the alert
            controller.PresentViewController(alert,true,null);

            // Return created controller
            return alert;
        }
        #endregion

        #region Delegates
        public delegate void AlertOKCancelDelegate(bool OK);
        public delegate void AlertTextInputDelegate(bool OK, string text);
        #endregion
    }
}

Используя этот класс, отображение и реагирование на простые оповещения можно сделать следующим образом:

#region Custom Actions
partial void DisplayDestructiveAlert (Foundation.NSObject sender) {
    // User helper class to present alert
    AlertViewController.PresentDestructiveAlert("A Short Title is Best","The message should be a short, complete sentence.","Delete",this, (ok) => {
        Console.WriteLine("Destructive Alert: The user selected {0}",ok);
    });
}

partial void DisplayOkCancelAlert (Foundation.NSObject sender) {
    // User helper class to present alert
    AlertViewController.PresentOKCancelAlert("A Short Title is Best","The message should be a short, complete sentence.",this, (ok) => {
        Console.WriteLine("OK/Cancel Alert: The user selected {0}",ok);
    });
}

partial void DisplaySimpleAlert (Foundation.NSObject sender) {
    // User helper class to present alert
    AlertViewController.PresentOKAlert("A Short Title is Best","The message should be a short, complete sentence.",this);
}

partial void DisplayTextInputAlert (Foundation.NSObject sender) {
    // User helper class to present alert
    AlertViewController.PresentTextInputAlert("A Short Title is Best","The message should be a short, complete sentence.","placeholder", "", this, (ok, text) => {
        Console.WriteLine("Text Input Alert: The user selected {0} and entered `{1}`",ok,text);
    });
}
#endregion

Итоги

В этой статье рассматривается работа с UIAlertController отображением сообщения оповещения пользователю в Xamarin.tvOS. Во-первых, он показал, как отобразить простое оповещение и добавить кнопки. Далее было показано, как добавить текстовые поля в оповещение. Наконец, он показал, как использовать вспомогательный класс для уменьшения объема повторяющегося кода, необходимого для отображения оповещения.