UIAlertControllerのTextField変更をPublisherで監視


UIAlertControllerのテキストフィールド監視は、調べるとDelegateやNotificationなどのいくつかの方法での解決方法が出てきますが、この実装はCombineフレームワークのPublisherを利用したものです。

実装

実装は簡単です。ViewControllerの宣言部でCombineフレームワークのimportを宣言し、プライベート変数としてcancellablesを初期化します。

import Combine

class ViewController : UIViewController {

    private var cancellables: Set<AnyCancellable> = .init()
    (...)
}

そしてAlertControllerの利用部分で以下のバインディングを宣言します。

alertController.addTextField { [weak self] (textField) in
    guard let self = self else { return }
    textField.placeholder = "placeholder"
    textField.text = "initialText"

    NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification, object: textField)
        .receive(on: DispatchQueue.main)
        .compactMap({ $0.object as? UITextField })
        .map({ $0.text?.isEmpty ?? true })
        .sink(receiveValue: { isEmpty in
            saveAction.isEnabled = !isEmpty // たとえば保存ボタンのenable切り替えなど
        })
        .store(in: &self.cancellables)
}