Установите делегата для textField во ViewController, который является владельцем.xib

Я пытаюсь использовать файл XIB для отображения пользовательского представления изменения. Для этого я использую SimpleAlert отсюда. У меня есть файл.xib с моими textFields в нем, и как владелец.xib я установил ViewController создан.

import UIKit

class TestBaumViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var tfFirst: UITextField!
@IBOutlet weak var tfSecond: UITextField!
@IBOutlet weak var tfThird: UITextField!
@IBOutlet weak var tfFourth: UITextField!


init() {
    super.init(nibName: "TestBaumViewController", bundle: nil)
    initializeTextFields()
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    //initializeTextFields()
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    //initializeTextFields()
}

override func awakeFromNib() {
    super.awakeFromNib()
    //initializeTextFields()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func initializeTextFields() {
    tfFirst.delegate = self // Error Here!
    tfFirst.keyboardType = UIKeyboardType.ASCIICapable

    tfSecond.delegate = self
    tfSecond.keyboardType = UIKeyboardType.NumberPad

    tfThird.delegate = self
    tfThird.keyboardType = UIKeyboardType.ASCIICapable

    tfFourth.delegate = self
    tfFourth.keyboardType = UIKeyboardType.NumberPad
}

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    var result = true
    let prospectiveText = (textField.text as NSString).stringByReplacingCharactersInRange(range , withString: string)

    if textField == tfFirst {
        if count(string) > 0 {
            let disallowedCharacterSet = NSCharacterSet(charactersInString: "BW").invertedSet
            let replacementStringIsLegal = string.rangeOfCharacterFromSet(disallowedCharacterSet) == nil

            let resultingStringLengthIsLegal = count(prospectiveText) <= 1

            result = replacementStringIsLegal && resultingStringLengthIsLegal
        }
    }

    if textField == tfSecond {
        if count(string) > 0 {
            let disallowedCharacterSet = NSCharacterSet(charactersInString: "0123456789").invertedSet
            let replacementStringIsLegal = string.rangeOfCharacterFromSet(disallowedCharacterSet) == nil

            let resultingStringLenthIsLegel = count(prospectiveText) <= 3

            result = replacementStringIsLegal && resultingStringLenthIsLegel
        }
    }

    if textField == tfThird {
        if count(string) > 0 {
            let disallowedCharacterSet = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyz").invertedSet
            let replacementStringIsLegal = string.rangeOfCharacterFromSet(disallowedCharacterSet) == nil

            let resultingStringLenthIsLegel = count(prospectiveText) <= 1

            result = replacementStringIsLegal && resultingStringLenthIsLegel
        }
    }

    if textField == tfFourth {
        if count(string) > 0 {
            let disallowedCharacterSet = NSCharacterSet(charactersInString: "0123456789").invertedSet
            let replacementStringIsLegal = string.rangeOfCharacterFromSet(disallowedCharacterSet) == nil

            let resultingStringLenthIsLegel = count(prospectiveText) <= 3

            result = replacementStringIsLegal && resultingStringLenthIsLegel
        }
    }
    return result
}

Как вы можете видеть, я добавил IBOutlets для своих текстовых полей, и теперь я хотел добавить этот контроллер представления в качестве их делегата. Так что я могу проверить, что было введено в текстовые поля.

Я пробовал разные подходы. Сначала я попытался положить textfield.delegate = self в метод viewDidLoad, но там я получаю сообщение об ошибке "Неустранимая ошибка: неожиданно обнаружил ноль при развертывании необязательного значения", я думаю, это потому, что текстовое поле не создается jet. Затем он попробовал метод viewDidAppear, с тем же результатом. И, наконец, после того, как я добавил объект в.xib с классом контроллера представления, установленным в качестве его класса для запуска метода awakeFromNib, я поместил textfield.delegate = self в этот метод. Но я получаю ту же ошибку здесь.

Есть ли что-то, о чем я не думал, или я делаю что-то, что не будет работать?

С уважением Adarkas

2 ответа

Поскольку вы уже заявили, что ваш контроллер соответствует UITextFieldDelegate протокол, сделайте это в Интерфейсном Разработчике:

  1. Выберите текстовое поле
  2. Показать инспектор соединений
  3. Там будет Outlets раздел с delegate под ним.
  4. Перетащите круг справа от delegate к вашему объекту View Controller, как показано под

  1. Сделайте это для каждого textField

Методы делегата textField теперь должны вызываться правильно.

Что насчет didSet?

class TestBaumViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var tfFirst: UITextField! {
        didSet {
            tfFirst.delegate = self
        }
    }
...

Или вы также можете перетащить делегаты текстовых полей в XIB. Щелкните правой кнопкой мыши текстовое поле и перетащите свойство делегата в контроллер представления.

Другие вопросы по тегам