Работа с оповещениями tvOS в Xamarin
В этой статье рассматривается работа с UIAlertController для отображения сообщения оповещения пользователю в Xamarin.tvOS.
Если вам нужно привлечь внимание пользователя tvOS или попросить разрешение на деструктивное действие (например, удаление файла), вы можете представить сообщение оповещения с помощью 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. Во-первых, он показал, как отобразить простое оповещение и добавить кнопки. Далее было показано, как добавить текстовые поля в оповещение. Наконец, он показал, как использовать вспомогательный класс для уменьшения объема повторяющегося кода, необходимого для отображения оповещения.