GitHub - marty-suzuki/NoticeObserveKit: NoticeObserveKit is type-safe Notificati...
source link: https://github.com/marty-suzuki/NoticeObserveKit
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
README.md
NoticeObserveKit
NoticeObserveKit is type-safe NotificationCenter wrapper.
// .keyboardWillShow is a static property. Notice.Center.default.observe(name: .keyboardWillShow) { keyboardInfo in // In this case, keyboardInfo is UIKeyboardInfo type. // It is inferred from a generic parameter of Notice.Name<Value>. print(keyboardInfo) } // pool is Notice.ObserverPool. // If pool is released, Notice.Observes are automatically removed. .invalidated(by: pool)
Usage
First of all, you need to implement Notice.Name<T>
like this.
T
is type of value in notification.userInfo.
extension Notice.Names { static let keyboardWillShow = Notice.Name<UIKeyboardInfo>(UIResponder.keyboardWillShowNotification) }
If you define custom object, you need to implement that with NoticeUserInfoDecodable
protocol. To confirm this protocol, you must implement init?(info: [AnyHashable : Any])
and func dictionaryRepresentation() -> [AnyHashable : Any]
.
struct UIKeyboardInfo: NoticeUserInfoDecodable { let frame: CGRect let animationDuration: TimeInterval let animationCurve: UIViewAnimationOptions init?(info: [AnyHashable : Any]) { guard let frame = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue, let duration = info[UIKeyboardAnimationDurationUserInfoKey] as? TimeInterval, let curve = info[UIKeyboardAnimationCurveUserInfoKey] as? UInt else { return nil } self.frame = frame self.animationDuration = duration self.animationCurve = UIViewAnimationOptions(rawValue: curve) } }
Usage for under v0.4.0 is documents/v0_4_0.
Customization
If you can post custom Notification like this.
extension Notice.Names { static let navigationControllerDidShow = Notice.Name<NavigationControllerContent>(name: "navigationControllerDidShow") } let content = NavigationControllerContent(viewController: viewController, animated: animated) Notice.Center.default.post(name: .navigationControllerDidShow, value: content)
You can invalidate manually like this.
let observer = Notice.Center.default.observe(name: .keyboardWillShow) { keyboardInfo in print(keyboardInfo) } observer.invalidate()
You can use vi NotificationCenter.
NotificationCenter.default.nok.observe(name: .keyboardWillShow) { keyboardInfo in print(keyboardInfo) } .invalidated(by: pool)
Sample
import UIKit import NoticeObserveKit class ViewController: UIViewController { private let searchBar = UISearchBar(frame: .zero) private var pool = Notice.ObserverPool() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. navigationItem.titleView = searchBar configureObservers() } private func configureObservers() { Notice.Center.default.observe(name: .keyboardWillShow) { print("UIKeyboard will show = \($0)") }.invalidated(by: pool) Notice.Center.default.observe(name: .keyboardWillHide) { print("UIKeyboard will hide = \($0)") }.invalidated(by: pool) } }
Requirements
- Swift 4.2
- Xcode 10.1 or greater
- iOS 10.0 or greater
- tvOS 10.0 or greater
- macOS 10.10 or greater
- watchOS 3.0 or greater
Installation
CocoaPods
NoticeObserveKit is available through CocoaPods. To install it, simply add the following line to your Podfile:
pod "NoticeObserveKit"
Carthage
If you’re using Carthage, simply add
NoticeObserveKit to your Cartfile
:
github "marty-suzuki/NoticeObserveKit"
Make sure to add NoticeObserveKit.framework
to "Linked Frameworks and Libraries" and "copy-frameworks" Build Phases.
Author
marty-suzuki, [email protected]
License
NoticeObserveKit is available under the MIT license. See the LICENSE file for more info.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK