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)")
}
}
}
键盘
这个库包含了键盘事件的处理实现
KeyboardDidShowEvent
、KeyboardWillShowEvent
、KeyboardWillHideEvent
、KeyboardWillChangeFrameEvent
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()
}
}