Несколько UITextFields и textDidChangeNotification уведомление - PullRequest
0 голосов
/ 23 июня 2019

В последнее время я играл с фреймворком Combine, и мне было интересно, можно ли создать какое-нибудь умное расширение для изменения текста в качестве издателя.

Допустим, у меня есть два поля UITextFields:

firstTextField.textPub.sink {
    self.viewModel.first = $0
}

secondTextField.textPub.sink {
    self.viewModel.second = $0
}

где первая и вторая переменные просто `@Published var first / second: String =" "

extension UITextField {
    var textPub: AnyPublisher<String, Never> {
        return NotificationCenter.default
            .publisher(for: UITextField.textDidChangeNotification)
            .map {
                guard let textField = $0.object as? UITextField else { return "" }
                return textField.text ?? ""
            }
            .eraseToAnyPublisher()
    }
}

Это не работает, потому что я использую общий экземпляр NotificationCenter, поэтому, когда я делаю какие-либоизмените любое из textFields, оно распространит новое значение на оба sink замыкания.Как вы думаете, есть ли способ достичь чего-то похожего на rx.text, доступного в RxSwift?Я думал об использовании addTarget с замыканием, но это потребовало бы использования связанных объектов из Objective-C.

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Я понял это. Мы можем передать объект с помощью NotificationCenter, а затем отфильтровать все экземпляры, которые не соответствуют нашему экземпляру. Кажется, работает как я ожидал:

extension UITextField {
    var textPublisher: AnyPublisher<String, Never> {
        NotificationCenter.default
            .publisher(for: UITextField.textDidChangeNotification, object: self)
            .compactMap { $0.object as? UITextField }
            .filter { $0 == self }
            .map { $0.text ?? "" }
            .eraseToAnyPublisher()
    }
}
0 голосов
/ 24 июня 2019

Я бы предложил вам добавить подписчиков в модальное представление и подключить их к издателю текстового поля в контексте контроллера представления.

NotificationCenter полезен для отправки событий по всему приложению; нет необходимости использовать его при подключении элементов, полностью принадлежащих View Controller. Однако после обновления модального вида может иметь смысл опубликовать событие «Просмотр модального изменения» в NotificationCenter.

...