2014-10-28 3 views
5

Я потратил часы, пытаясь выяснить, как создать/затем получить заказ inputView для работы. У меня есть сетка TextInputs (подумайте, что скребцовая доска), что при нажатии должна загрузить пользовательский inputView для вставки текста.Пользовательский вход Просмотр в Swift

Я создал файл .xib, содержащий UI elements для пользовательских inputView. Я смог создать CustomInputViewController и появился inputView, но не смог получить фактическое TextInput, чтобы обновить его значение/текст.

Документация Apple показала, что она работает, и многие обучающие программы, которые я видел, использовали Obj-C (которые я не смог преобразовать из-за небольших вещей, которые, похоже, сейчас не могут быть сделано быстро).

Что такое всеобъемлющая архитектура и необходимые фрагменты кода, которые должны быть реализованы для создания customInputView для нескольких textInputs (цепочка делегатов, контроллер, .xibs, представления и т. Д.)?

+0

Создайте собственный файл класса и установите его как класс для xib в InterfaceBuilder. Затем вы можете ctrl-drag из элементов пользовательского интерфейса в файл класса (помощник редактора) для создания IBOutlets. Используйте эти выходы в вашем коде для обновления элементов пользовательского интерфейса. – zisoft

+0

Я смог создать IBOutlets/IBActions для кнопок в customView. Это было необходимо, но недостаточно для того, чтобы получить кнопки в customView для передачи textInput/keyboardFunctionality в вид TextInputs. – codycoats

+0

Разве ваши представления не должны реализовывать/соответствовать надлежащему протоколу? (UITextInput?). вы также можете сказать им, чтобы они стали первыми ответчиками, когда они прослушиваются. Я бы попробовал подклассифицировать UIControl vs. UIView – nielsbot

ответ

7

Вы не должны проходить через все эти хлопоты. В iOS 8 есть новый класс: UIAlertController, где вы можете добавить TextFields для ввода данных пользователем. Вы можете создать его как оповещение или ActionSheet.

Пример:

let alertAnswer = UIAlertController(title: "Input your scrabble Answer", message: nil, preferredStyle: .Alert) // or .ActionSheet 

Теперь, когда у вас есть контроллер, добавлять поля к нему:

alertAnswer.addTextFieldWithConfigurationHandler { (get) -> Void in 
      getAnswer.placeholder = "Answer" 
      getAnswer.keyboardType = .Default 
      getAnswer.clearsOnBeginEditing = true 
      getAnswer.borderStyle = .RoundedRect 
     } // add as many fields as you want with custom tweaks 

Добавить кнопки действий:

let submitAnswer = UIAlertAction(title: "Submit", style: .Default, handler: nil) 
let cancel = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
alertAnswer.addAction(submitAnswer) 
alertAnswer.addAction(cancel) 

Present контроллер всякий раз, когда вы хотите с :

self.presentViewController(alertAnswer, animated: true, completion: nil) 

Как вы видите, у вас есть различные обработчики для передачи пользовательского кода на любом этапе.

В качестве примера, вот как это будет выглядеть: An example of how it could look

9

Настройка острия файла с соответствующим макете inputView и предметов. В моем случае я установил каждую кнопку для действия с файловым владельцем inputViewButtonPressed.

Настройте раскадровку (или, если хотите, nib, если хотите) для контроллера вида.

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

class ViewController: UIViewController, UITextFieldDelegate { 
    var myInputView : UIView! 
    var activeTextField : UITextField? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // load input view from nib 
     if let objects = NSBundle.mainBundle().loadNibNamed("InputView", owner: self, options: nil) { 
      myInputView = objects[0] as UIView 
     } 

     // Set up all the text fields with us as the delegate and 
     // using our input view 
     for view in self.view.subviews { 
      if let textField = view as? UITextField { 
       textField.inputView = myInputView 
       textField.delegate = self 
      } 
     } 
    } 

    func textFieldDidBeginEditing(textField: UITextField) { 
     activeTextField = textField 
    } 

    func textFieldDidEndEditing(textField: UITextField) { 
     activeTextField = nil 
    } 

    @IBAction func inputViewButtonPressed(button:UIButton) { 
     // Update the text field with the text from the button pressed 
     activeTextField?.text = button.titleLabel?.text 

     // Close the text field 
     activeTextField?.resignFirstResponder() 
    } 
} 

В качестве альтернативы, если Вы желаете быть более клавиатурой, как вы можете использовать эту функцию в качестве действия (он использует новый синтаксис LET от Swift 1.2), разбить его, если вам нужно 1.1 совместимость:

@IBAction func insertButtonText(button:UIButton) { 
     if let textField = activeTextField, title = button.titleLabel?.text, range = textField.selectedTextRange { 
      // Update the text field with the text from the button pressed 
      textField.replaceRange(range, withText: title) 
     } 
    } 

Это использует протокол UITextInput для обновления текстового поля в зависимости от обстоятельств.Обработка удаления немного сложнее, но все же не так уж плохо:

@IBAction func deleteText(button:UIButton) { 
     if let textField = activeTextField, range = textField.selectedTextRange { 
      if range.empty { 
       // If the selection is empty, delete the character behind the cursor 
       let start = textField.positionFromPosition(range.start, inDirection: .Left, offset: 1) 
       let deleteRange = textField.textRangeFromPosition(start, toPosition: range.end) 
       textField.replaceRange(deleteRange, withText: "") 
      } 
      else { 
       // If the selection isn't empty, delete the chars in the selection 
       textField.replaceRange(range, withText: "") 
      } 
     } 
    } 
+0

Большое спасибо за этот ответ, Дэвид. Если бы я хотел повторно использовать клавиатуру в нескольких местах, что бы вы рекомендовали как лучший способ сделать это? –

+0

Вы можете подклассифицировать 'UIViewController', или вы можете создать этот код в подклассе' UITextField' или в отдельном классе контроллера. –

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

  • Нет связанных вопросов^_^