In the Swift 4 Method Swizzling (Part 1/2) post, We have seen the approach of using Base classes for a notification needed
whenever a view appears, Which resulted in code redundancy.
In this post, Let’s see how that can be solved using Method Swizzling.
Take an extension of UIViewController and apply swizzling for it’s viewWillAppear method.
--------------------------------------------------------------------------
extension UIViewController {
func newViewWillAppear(_ animated: Bool) {
self.newViewWillAppear(animated) //Incase we need to override this method
print("Display Notification!")
}
static func swizzleViewWillAppear() {
//Make sure This isn't a subclass of UIViewController, So that It applies to all UIViewController childs
if self != UIViewController.self {
return
}
let _: () = {
let originalSelector = #selector(UIViewController.viewWillAppear(_:))
let swizzledSelector = #selector(UIViewController.newViewWillAppear(_:))
let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
method_exchangeImplementations(originalMethod!, swizzledMethod!);
}()
}
}
--------------------------------------------------------------------------
Here, I am swapping, viewWillAppear with my custom Method newViewWillAppear using method_exchangeImplementations, Which is from ObjectiveC runtime.
--------------------------------------------------------------------------
method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2)
--------------------------------------------------------------------------
At run time, calling viewWillAppear on UIViewController calls newViewWillAppear method,
Where we will have the notification logic.
Now, In the child classes of UIViewControllers, super.ViewWillAppear, Calls the newViewWillAppear.
The beauty here is, The same will get called for UITableViewController and UINavigationController also as they are also extended from UIViewController.
Thus, Using Method Swizzling, There will not be any code redundancy.
Unlike in Swift3x, In swift 4, We can not write this swizzling the initialise method, And we can call it in AppDelegate.
--------------------------------------------------------------------------
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UIViewController.swizzleViewWillAppear()
return true
}
--------------------------------------------------------------------------
So, Whenever app launches, This swizzling applies and stays.
Hope this post is useful. Feel free to comment incase of any queries.
Swift Protocols & Extensions |
---|
Swift Comparable Protocol |
Swift Equatable Protocol |
Protocol Extensions for Default and Convenient API |
Protocols vs Base classes |
Multiple Inheritance using protocols |
Swift Protocol Extensions |
Swift Constrained Extensions |
Multiple Inheritance, Diamond problem |
Multiple Inheritance using protocols, Diamond Problem |
Swift - Preserving Structure Default Initializer using Extensions |
Swift Closures |
---|
Swift Closures Capture List |
Swift Escaping Closures (@escaping) |
Swift - weak and unowned references |
Swift 4 Tutorials |
---|
Swift 4 NEW Tutorial-1 (One Sided Ranges) |
Swift 4 NEW Tutorial-2 (Strings are Collections Again) |
Swift 4 NEW Tutorial-3 (private instead fileprivate) |
Swift 4 NEW Tutorial-4 (fileprivate to private) |
Swift CoreData Tutorials |
---|
Swift - CoreData - CRUD Operations (Tutorial-1) |
Swift - CoreData - Validations (Tutorial-2) |
Swift - CoreData - To One Relationship (Tutorial-3) |
Swift - CoreData - To One - Inverse Relationship (Tutorial-4) |
Swift - CoreData - To Many - Inverse Relationship (Tutorial-5) |
Method Swizzling Tutorials |
---|
Swift 4, Method initailize defines Objective-C class method initialize(), which is not guaranteed to be invoked by Swift and will be disallowed in future versions |
Swift 4 Method Swizzling (Part 2/2) |
Swift 4 Method Swizzling (Part 1/2) |
NSPredicate Tutorials |
---|
Objective C NSPredicate Part 1/4 |
Objective C NSPredicate Part 2/4 |
Objective C NSPredicate Part 3/4 |
Objective C NSPredicate Part 4/4 |
iOS Fixing Security Vulerabilities Tutorials |
---|
iOS Format String Attacks |
iOS Jailbreak Unchecked File Operation Result Code |
iOS Screen Caching Security Vulnerability |
XMPP Chat Framework Tutorials |
---|
Encoding & Decoding emoji characters In the chat applications using Objective C |
Objective C methods for new user registration in xmpp framework |
Objective-C XMPP search users by username |
Retrieving chat history from Openfire using XMPP |
Displaying emoji characters in UILabel |
Getting old messages or chat history from XMPP |
XMPP searching users by username |
XMPP framework User Registration Methods |
XMPP user change password using Objective C |
Change XMPP registered user password |
Blog Archive |
---|
Custom cell class data source in MVVM design pattern |
Swift - Multiple levels of Optional Binding |
Swift - App is currently in Main Thread or not |
Swift Nil-Coalescing Operator for Optionals |
Enum raw value comparisons |
guard statement return/break/continue |
Case-sensitive and Case-Insensitive sorting |
valueForKey (vs) objectForKey |
If-Let & Guard-Let Multiple Optional Bindings |
Color and Image Literals |
Swift Enums as Models |
Swift convenience initializers |
Tappable links in UITextView |
UITableView Scrolling issue for cells having UITextField/UITextView as subviews |
illegal Configuration Safe Area Layout Guide before iOS 9.0 |
iOS Checking device is in 24 hour format or not |
Displaying URL loading error in WebView in HTML format |
Checking whether iOS app is running in a device having safe area (iPhoneX) or not |
xcodebuild: error: invalid option '-exportFormat' |
Interface Segregation Principle in SOLID (Object-Oriented Design) |
Swift - Handling web links in dynamic content |
Swift - Class and Static Methods |
Swift - MVVM - RXSwift Instead of didSet() |
Swift Failable Initializers |
Objective-C/Swift avoid crashes in iPad in an iPhone Application |
ReplyDeleteThis article is very much helpful and i hope this will be an useful information for the needed one.Keep on updating these kinds of informative things ios online training hyderabad
This is a wonderful blog post. Thanks for sharing the information. For more details kindly visit us at Swift App Development Company in India. Call us: +91-7314236251 or mail us at sales@samosys.com
ReplyDelete