Sunday, November 5, 2017

Swift 4 Method Swizzling (Part 2/2)

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
SharePoint API Tutorials
Objective-C Upload File SharerPoint Soap Service
Objective-C Create Folder SharerPoint Soap Service
Objective-C Renaming Folder or File of a SharePoint content
Objective C SharePoint content fetch soap service
Objective C SharePoint login service
Objective-C SharePoint User Permissions
Objective-C SharePoint User Profile Service
Objective-C SharePoint Service For Deleting An Item
Objective-C SharePoint Authentication Mode
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

2 comments:


  1. This 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

    ReplyDelete
  2. 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