Настройка острия файла с соответствующим макете 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: "")
}
}
}
Создайте собственный файл класса и установите его как класс для xib в InterfaceBuilder. Затем вы можете ctrl-drag из элементов пользовательского интерфейса в файл класса (помощник редактора) для создания IBOutlets. Используйте эти выходы в вашем коде для обновления элементов пользовательского интерфейса. – zisoft
Я смог создать IBOutlets/IBActions для кнопок в customView. Это было необходимо, но недостаточно для того, чтобы получить кнопки в customView для передачи textInput/keyboardFunctionality в вид TextInputs. – codycoats
Разве ваши представления не должны реализовывать/соответствовать надлежащему протоколу? (UITextInput?). вы также можете сказать им, чтобы они стали первыми ответчиками, когда они прослушиваются. Я бы попробовал подклассифицировать UIControl vs. UIView – nielsbot