代码之家  ›  专栏  ›  技术社区  ›  Nikhil Sawant

更改根视图控制器会将IBOutlet设置为nil

  •  0
  • Nikhil Sawant  · 技术社区  · 7 年前

    我必须根据登录状态更改我的根视图控制器。

    我已经更改了AppDelegate文件,并创建了一个MainNavigationController类,该类扩展了UINavigationController。

    **问题:-** 加载定义的根类时,它将所有出口变量都设置为nil。

    代码

     class PostalViewController: UIViewController {
    
            @IBOutlet weak var btn_currentLocation: UIButton!
            @IBOutlet weak var btn_viewAccount: UIButton!
            @IBOutlet weak var in_postCode: UITextField!
    
            let locManager = CLLocationManager()
    
            override func viewDidLoad() {
                super.viewDidLoad()
    
    // Here it gives a nil on btn_currentLocation
    
                btn_currentLocation.layer.cornerRadius = 15.0
                btn_currentLocation.layer.masksToBounds = true
    
                btn_currentLocation.setButtonGradient(colorOne: UIColor(named: "lightBlue")!, colorTwo: UIColor(named: "gradient2")!)
    
                btn_viewAccount.layer.cornerRadius = 15.0
                btn_viewAccount.layer.masksToBounds = true
    
                // Add search button in post code text field
                let searchButton = UIButton(type: .custom)
                searchButton.setImage(UIImage(named: "iconSearch"), for: .normal)
                searchButton.frame = CGRect(x: CGFloat(in_postCode.frame.size.width - 25), y: CGFloat(5), width: CGFloat(25), height: CGFloat(25))
                searchButton.addTarget(self, action: #selector(self.actionSearch), for: .touchUpInside)
                in_postCode.rightView = searchButton
                in_postCode.rightViewMode = .always
    
            }
    

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
    
            window = UIWindow(frame: UIScreen.main.bounds)
            window?.makeKeyAndVisible()
            window?.rootViewController = MainNavigationController() 
            return true
        }
    

    MainNavigationController.swift

    class MainNavigationController : UINavigationController{
    
        var isLogin : Bool?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            view.backgroundColor = .white
    
            isLogin = UserDefaults.standard.bool(forKey: "isLogin")
            print("IsLogin --->", isLogin!)
    
            if (isLogin != nil && isLogin!){
    
                perform(#selector(postalController), with: nil, afterDelay: 0.01)
    
            }else{
    
                perform(#selector(showHomeContoller), with: nil, afterDelay: 0.01)
            }
    
        }
    
        @objc func showHomeContoller () {
    
            let homepageController = HomePageViewController()
            present(homepageController, animated: true, completion: nil)
        }
    
        @objc func postalController () {
    
            let postalController = PostalViewController()
            viewControllers = [postalController]
        }
    }
    

    编辑

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  1
  •   Robert Dresler Gustavo Vollbrecht    7 年前

    我想您只是想在用户登录时显示PostalViewController。如果用户未登录,则只需显示HomePageViewController。首先从app delegate中删除这些行,您不需要:

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()
    window?.rootViewController = MainNavigationController() 
    

    isLogin = UserDefaults.standard.bool(forKey: "isLogin")
        print("IsLogin --->", isLogin!)
    
    if isLogin != nil {
        performSegue(withIdentifier: "segueToPostal", sender: self)
    }
    

    enter image description here enter image description here

    并将其标识符设置为

    enter image description here

    如果您不想让用户从Postal view controller导航回来,您可以在新的NavigationController中添加PostalViewController。然后只需将segue从HomePageViewController设置为此NavigationController并设置标识符。

        2
  •  1
  •   Gkolunia    7 年前

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
    

    例如,如果配置iBoulet的xib文件的名称与控制器名称相同,则可以执行以下操作:

    let postalController = PostalViewController(nibName: "PostalViewController", bundle: nil) 
    

    对于使用故事板,您应该从故事板初始化它们。 尝试下一步操作:

    let sb = UIStoryboard(name: "MainStoryboard", bundle: nil) 
    let vc = sb.instantiateViewController(withIdentifier: "PostalViewController") 
    

    您应该在故事板中为控制器设置故事板id,如下面的屏幕所示。

    storyboard id

    此外,您还可以在这里找到有关如何从故事板正确初始化视图控制器的更多信息

    What is a StoryBoard ID and how can i use this?