Search code examples
iosswiftpushviewcontroller

PushViewController from another UIViewController - Swift


I have a class like this,

import UIkit

class One {

    let btn = UIButton()

    override func viewDidLoad(){
        super.viewDidLoad()

        btn.frame = CGRectMake(10, 20, 30, 30)
        btn.setTitle("Go", forState: UIControlState.Normal)
        btn.addTarget(self, action: "goToClassTwo", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(btn)
    }

    func goToClassTwo(){
        if(AppGlobals().getIsFromDiffView()){
             let difView = UINavigationController(rootViewController: DiffView())
             difView.pushViewController(Two(), animated: true)
        }else{
             self.navigationController?.pushViewController(Two(), animated: true)
        }
    }
}

A setter/getter class like this,

class AppGlobals: NSObject {

     var isFromDiffView = false

     func setIsFromDiffView(val: Bool){
         isFromDiffView = val
     }

     func getIsFromDiffView() -> Bool {
         return isFromDiffView
     }

}

And I have another class like this,

class DiffView {

    let btn = UIButton()

    override func viewDidLoad(){
        super.viewDidLoad()

        btn.frame = CGRectMake(10, 20, 30, 30)
        btn.setTitle("Push", forState: UIControlState.Normal)
        btn.addTarget(self, action: "btnAction", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(btn)
    }

    func btnAction(){
        AppGlobals().setIsFromDiffView(true)
        One().goToClassTwo()
    }
}

I am facing a problem here. When the 'Go' button in the class 'One' is tapped, then the 'Two' view controller is shown. But when I tap on the 'Push' button in the class 'DiffView' is tapped, the 'Two' view controller is not being shown.

I have checked setting breakpoints. The control does come to the goToClassTwo function in the class 'One' and the if path is being executed. But the 'Two' view controller is not shown. difView.pushViewController is called. But it is not pushing to the next view.

NOTE: I am not using storyboard

Any help would be appreciated!


Solution

  • This is the updated code.

    Code for class 'One':

    import UIKit
    
    class One {
    
        let btn = UIButton()
    
        override func viewDidLoad(){
            super.viewDidLoad()
    
            btn.frame = CGRectMake(10, 20, 30, 30)
            btn.setTitle("Go", forState: UIControlState.Normal)
            btn.addTarget(self, action: "goToClassTwo", forControlEvents: UIControlEvents.TouchUpInside)
            self.view.addSubview(btn)
        }
    
        func goToClassTwo(){
            if(AppGlobals().getIsFromDiffView()){
                 //Using the navigation controller of DiffView
                 AppGlobals().getController().pushViewController(Two(), animated: true)
            }else{
                 self.navigationController?.pushViewController(Two(), animated: true)
            }
        }
    }
    

    setter/getter class:

    class AppGlobals: NSObject {
    
         var isFromDiffView = false
         var cntrlr: UINavigationController!
    
         func setIsFromDiffView(val: Bool){
             isFromDiffView = val
         }
    
         func getIsFromDiffView() -> Bool {
             return isFromDiffView
         }
    
         //Setting and getting DiffView Navigation controller
         func setController(cntrl: UINavigationController){
             cntrlr = cntrl
         }
    
         func getController() -> UINavigationController {
             return cntrlr
         }
    
    }
    

    DiffView class:

    class DiffView {
    
        let btn = UIButton()
    
        override func viewDidLoad(){
            super.viewDidLoad()
    
            btn.frame = CGRectMake(10, 20, 30, 30)
            btn.setTitle("Push", forState: UIControlState.Normal)
            btn.addTarget(self, action: "btnAction", forControlEvents: UIControlEvents.TouchUpInside)
            self.view.addSubview(btn)
        }
    
        func btnAction(){
            AppGlobals().setIsFromDiffView(true)
            //Setting the navigation controller
            AppGlobals().setController(self.navigationController!)
            One().goToClassTwo()
        }
    }
    

    With this updated code, class 'Two' view controller is being displayed. Thank you @zp_x for your help.