Переключение между элементами управления и кнопка Готово в текстовых полях Monotouch

Для того, чтобы разработанным приложением было удобно пользоваться у него должно быть идеальное удобство использования. С одной из таких проблем сегодня научимся справляться. Определенно сложная задача - пользовательский ввод с экрана маленького смартфона в мобильное приложение. Тем более, если форма длинная и много полей. Для этого существуют переключатели полей и кнопка "Готово".

Prev Next Button iOS textedit

Это результат который получим, добавив логику в приложение. Этот механизм не доступен в Cocoa Touch по умолчанию, поэтому придется его создать с нуля. В дополнение к этому элементу, если на форме много полей - необходимо добавить прокрутку на форме. Но об этом в другой раз. Сейчас задачей является добавление кнопок "вперед" и "назад".

В Monotouch для этого есть свойство InputAccessoryView у типа UIView, которое действует с iOS 3.2. Реализуется это в виде UIToolbar над клавиатурой. 

Код довольно простой и легко переводится с форумов по Objective-C:

public static UIToolbar GetToolbarWithPrevEnabled(UIView source, UIResponder prev, UIResponder next, bool done)
        {
            //Создаем панель инструментов
            UIToolbar toolbar = new UIToolbar();
            toolbar.BarStyle = UIBarStyle.Default;
            toolbar.SizeToFit();

            UISegmentedControl leftItems = new UISegmentedControl(new object[]{ "Назад", "Вперед" });

            //Необходимо для придания панели инструментов компактного вида
            //Свойство устаревшее с 7 версии iOS
            if (!IOSDeviceHardware.IsiOS7)
                leftItems.ControlStyle = UISegmentedControlStyle.Bar;

            leftItems.SetEnabled(prev != null, 0);
            leftItems.SetEnabled(next != null, 1);
            leftItems.Momentary = true;
            leftItems.ValueChanged += (object sender, EventArgs e) =>
            {
                switch (((UISegmentedControl)sender).SelectedSegment)
                {
                    case 0:
                        if (prev != null)
                            prev.BecomeFirstResponder();
                        break;
                    case 1:
                        if (next != null)
                            next.BecomeFirstResponder();
                        break;
                    default:
                        break;
                }
            };

            UIBarButtonItem nextPrevControl = new UIBarButtonItem(leftItems);
            UIBarButtonItem flexSpace = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace);
            UIBarButtonItem doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Done);

            doneButton.Clicked += delegate
            {
                source.EndEditing(true);
            };

            toolbar.SetItems(new UIBarButtonItem[]{ nextPrevControl, flexSpace, doneButton }, true);
            return toolbar;
        }

 Идея заключается в создании View для каждого объекта, которому требуется панель инструментов (TextField и TextView). Скрывать клавиатуру будем вызовом метода EndEditing(true) у UIView (UITextView и UITextField являются наследниками UIView).

Для того, чтобы передать фокус элементу управления - вызываем у него BecomeFirstResponder. Так как TextField и TextView разные классы то уточнив у какого типа вызывается метод BecomeFirstResponder, можно сделать общий метод. Этот тип UIResponder. Именно поэтому можно написать только 1 метод вида: 

GetToolbarWithPrevEnabled(UIView source, UIResponder prev, UIResponder next, bool done)

который принимает на вход: текущий элемент управления, предыдущий, следующий и флаг, отвечающий за кнопку "Готово".

Дополним методами для удобного использования:

public static void ApplyKeyboardToolbar(this UITextField source,
                                                UIResponder prev, UIResponder next, bool done = true)
        {
            if (source.InputAccessoryView == null)
                source.InputAccessoryView = KSEnhancedKeyboard.GetToolbarWithPrevEnabled(source, prev, next, done);

        }

Пример вызова методов для работы с панелью инструментов клавиатуры в приложении iOS на Monotouch:

_textBoxSubject.ApplyKeyboardToolbar(null, _textBoxName);
_textBoxName.ApplyKeyboardToolbar(_textBoxSubject, _textBoxEmail);
_textBoxEmail.ApplyKeyboardToolbar(_textBoxName, _textBoxDetails);
_textBoxDetails.ApplyKeyboardToolbar(_textBoxEmail, null);

Скачать

Скачать полный код KSEnhancedKeyboard.cs

 

Комментарии

comments powered by Disqus