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

Changing Root view controllers gives IBOutlet as nil

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

我更改了我的 AppDelegate 文件并创建了一个扩展 UINavigationController 的 MainNavigationController class。

**问题:- ** 当加载定义的根 class 时,它会将所有出口变量设为 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

        }

AppDelegate.swift(只有那个特定的函数)

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]
    }
}

编辑

我在下面添加了一个屏幕截图,我必须在主页和邮政之间切换我的根视图

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

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

现在删除整个导航控制器class。您不需要它,因为您将在 HomePageViewController 中完成所有这些操作。现在在 HomePageViewController swift 文件中将其添加到 viewDidLoad()

isLogin = UserDefaults.standard.bool(forKey: "isLogin")
    print("IsLogin --->", isLogin!)

if isLogin != nil {
    performSegue(withIdentifier: "segueToPostal", sender: self)
}

最后设置从 HomePageViewController 到 PostalViewController 的 segue

并将其标识符设置为 segueToPostal

如果您不想让用户从 Postal 视图控制器导航回来,您可以将 PostalViewController 嵌入到新的 NavigationController 中。然后只需将 segue 从 HomePageViewController 设置到此 NavigationController 并设置标识符。

当使用 nib 文件初始化视图控制器时设置 IBOulet。 所以你需要使用下面的 init 方法创建视图控制器

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

例如,如果你配置 IBOultets 的 xib 文件的名称与控制器名称相同,你可以执行下一步:

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

在这里您将拥有带有已初始化 IBOutlets 的控制器。

要使用情节提要,您应该从情节提要中初始化它们。 尝试用下一种方式 ini 控制器:

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?