Как установить делегата подпредставления - PullRequest
0 голосов
/ 03 мая 2018

У меня есть пользовательское представление, созданное подклассом UIView, и у него есть два подпредставления UITextView, которые создаются внутри его метода init. Скажем для пояснения, что у меня есть суперпредставление A, содержащее два UITextViews B и C.

С другой стороны, у меня есть UIViewController VC, который управляет суперпредставлением A и отвечает за его управление. Это означает, что у него есть метод, который контролирует, что происходит, когда пользователь изменяет текст на C.

Когда кто-то должен контролировать UITextView, он обычно делает что-то вроде

textView.delegate = self

Я хочу сделать то же самое, но C не виден из VC. VC просто использует A, поэтому у меня есть

a.delegate = self

и тогда у меня появилась идея сделать это внутри реализации A:

weak var delegate: UITextViewDelegate? {
    get {
        return c.delegate
    }

    set {
        c.delegate = newValue
    }
}

Но это дает мне ошибку, говоря, что это разворачивает необязательное значение, фактическое значение которого равно nil.

Итак, как правильно управлять UITextView C (который находится внутри UIView A) из VC, который имеет только экземпляр A.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Если вы добавили UITextField в Xcode Interface Builder, вы можете создавать выходы для текстовых полей в ViewController (даже если текстовые поля являются дочерними дочерними элементами представления, которым управляет viewcontroller) ).

Таким образом, продолжая свое наименование, вы добавляете следующие выходы в ViewController:

@IBOutlet weak var B: UITextField!
@IBOutlet weak var C: UITextField!

и в ваших ViewController viewDidLoad() добавьте:

B.delegate = self
C.delegate = self

Если вы создали UITextField программно, вы можете установить для них значение tag, например. 1 и 2 (0, скорее всего, уже используется), а затем получите представление из вашего ViewController следующим образом:

let B = self.view.viewWithTag(1) as? UITextField
let C = self.view.viewWithTag(2) as? UITextField

Конечно, убедитесь, что ViewController расширяется UITextFieldDelegate, то есть:

class ViewController: UIViewController, UITextFieldDelegate {...}
0 голосов
/ 03 мая 2018

Скорее всего, c возможно, ноль. Чтобы решить эту проблему, необходимо установить делегат после инициализации c.

В качестве альтернативы, создайте свой собственный делегат - ADelegate! Таким образом, вы можете называть свои собственные методы делегата более значимыми именами!

protocol ADelegate : class {
    func cDidChange()
}

В A:

weak var delegate: ADelegate?

Теперь A должен реализовать UITextViewDelegate, установить c.delegate на себя и передать методы на self.delegate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...