2013-06-30 3 views
1

У меня есть относительно большое приложение для iPhone со многими видами. Я хотел бы реализовать следующую/предыдущую опцию на моей клавиатуре. Мне удалось реализовать его UI-мудрый, с некоторыми примерами кода, которые я видел в Интернете, но все они предполагают, что нам нужно добавить код для каждого контроллера представления для реализации фактического перехода между текстовыми полями.iOS: автоматический способ перехода между текстовыми полями

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

Я задаю этот вопрос, потому что, когда я использую симулятор iPhone и нажимаю клавишу Tab Tab - переключатель между полями происходит, поэтому мне интересно, есть ли встроенный или общий способ реализовать его на iOS.

уточнение: Есть ли способ сделать это без добавления определенного кода для каждого типа контроллера вида? (добавление общего кода допустимо)

+0

Нет. Нет никакого способа сделать это, не добавляя логику кода для перемещения между полями. – Geek

+0

Вы должны были поставить это как ответ, а не комментарий. Комментарии предназначены только для уточнения. – SevenBits

+0

Я уточню: есть ли способ сделать это, не добавляя конкретный код для каждого типа контроллера вида? (добавление общего кода в порядке) – Eliktz

ответ

2

Я хочу написать, как я решил эту проблему, с помощью многих хороших ответов мне здесь :)

Во-первых, я не мог создать полностью общий код, который создает вкладку независимо от зрения она находится . Вместо я создал эту вещь, которую я думаю, это наиболее общее решение с методом firstResponder не работает:

  • я создал пользовательскую панель инструментов с моей следующей/предыдущей/сделать кнопки и соответствующие действия делегата.
  • , чем я расширил UIViewController, добавив категорию «Tab». эта категория объявляет fieldArray и реализует метод делегата.
  • Теперь то, что каждый конкретный контроллер представления должен делать (кроме импорта категории) является обеспечение этого fieldsArray по своим свойствам и вызова метода инициализации, который добавляет кнопки на панели инструментов этого поля

Я надеюсь, что вы могли бы извлечь выгоду из этого, и снова спасибо за все хорошие ответы

0

у вас может быть метод в классе утилиты, который принимает в качестве аргументов текстовое поле и viewcontroller. то вы можете использовать атрибут «tag» текстовых полей, чтобы найти следующее текстовое поле в этом viewcotroller, предполагая, что вы соответствующим образом назначили теги. номера были бы здоровыми, я думаю. простой метод обратного вызова в vc может обрабатывать изменение фокуса. это примерно так же, как я вижу сейчас.

+0

спасибо за ваш ответ. но использование свойства тега является одной из вещей, которые я пытался избежать, так как большинство моих таблиц создаются «на лету», а размещение всех в тегах - это немного беспорядочный процесс. – Eliktz

+0

@ Eliktz - теги - всего лишь предложение. вы можете определить следующее поле так, как вам нравится, механизм остается прежним. (например, вы можете использовать x-y-координаты, чтобы найти следующее поле?) – katzenhut

0

Это некоторый общий код, который я придумал:

// add a property for the fieldsArray 

//add this in viewDidLoad 
_fieldsArray = [[NSMutableArray alloc] init]; 
NSArray *viewsArray = [self.view subviews]; 
for (id view in viewsArray) { 
    if ([view isKindOfClass:NSClassFromString(@"UITextField")]) { 
     [_fieldsArray addObject:view]; 
    } 
} 

//add this in your action that switches the fields 
for (UITextField *field in _fieldsArray) { 
    if ([field isFirstResponder]) { 
     if ([fieldsArray lastObject] == field) { 
      [_fieldsArray[0] becomeFirstResponder]; 
     }else { 
      NSUInteger nextIndex = [_fieldsArray indexOfObject:field] + 1; 
      [_fieldsArray[nextIndex] becomeFirstResponder]; 
     } 
     break; 
    } 
} 

Перед использованием его следует улучшить.

1) найти все подвидов из self.view рекурсивно

2) сделать некоторые проверки, если массивы пусты или ноль или иметь только один объект в них.

Удачи вам!

Смежные вопросы