EventNotification 0.9

EventNotification 0.9

ark dan 维护。



  • 作者
  • ark dan

EventNotification

键盘

允许在应用程序的不同部分之间发送任意数据。通常,您会通过向 NotificationCenter 发送带有附加到 userInfo 的对象的 Notification 来这样做。这个库正是这样做的;带着糖

  • 不需要定义一个通知名称
  • 不需要取消订阅;在 deinit 上,观察者会自动从 NotificationCenter 中取消订阅
  • 仍然可以在任何点上取消订阅
  • 清晰的语法。
pod 'EventNotification'

比如说,你有

struct A {
    let string: String
}

要向所有感兴趣的观察者发送 A 的实例,

extension A: Event {}

class SomeEventObserver: EventObserver {
    let eventToken = EventToken()

    func startObservingA() {
        handleEvent(A.self) { [weak self] (a) in
            print("\(a.string)")
        }
    }
    
    func stopObservingA() {
        self.unsubscribe(A.self)
    }
    
    func stopObservingAll() {
        self.unsubscribe()
    }

let eventToken = EventToken() 是观察者类的唯一要求。

一个不常见的情况是,观察者类没有意向从观察事件中取消订阅(它将在 deinit 上自动取消订阅)。在这种情况下,观察者类可能需要符合 DefaultEventObserver,它提供了 var eventToken 的默认实现。

class OtherEventObserver: DefaultEventObserver {

    func startObservingA() {
        handleEvent(A.self) { [weak self] (a) in
            print("\(a.string)")
        }
    }
}

键盘

这个库包含了键盘事件的处理实现

KeyboardDidShowEventKeyboardWillShowEventKeyboardWillHideEventKeyboardWillChangeFrameEvent

class ViewControllerController: UIViewController, KeyboardEventObserver {

    let eventToken = EventToken()

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        onKeyboardWillAppear { [weak self] frame in
            var contentInsets: UIEdgeInsets = .zero
            contentInsets.bottom = frame.height
            self?.tableView.contentInset = contentInsets
            self?.tableView.scrollIndicatorInsets = contentInsets
        }

        onKeyboardDissappear { [weak self] in
            self?.tableView.contentInset = .zero
            self?.tableView.setContentOffset(.zero, animated: true)
        }
        
        onKeyboardFrameChanged { [weak self] frame in
            // new frame
        }
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        
        unsubscribeKeyboardAppear()
        unsubscribeKeyboardDisappear()
        
        // or,
        unsubscribe()
    }
}