Изменение контроллеров Root View дает IBOutlet как ноль - PullRequest
0 голосов
/ 12 ноября 2018

Я должен изменить свой контроллер корневого представления в соответствии со статусом входа в систему.

Мне пришлось изменить свой файл 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

        }

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

EDIT

Я добавил скриншот ниже, мне нужно переключить свое корневое представление между HomePage и Postal

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

IBOulet устанавливается, когда контроллер вида инициализируется с помощью nib-файла.Поэтому вам нужно создать контроллеры представления, используя метод init, описанный ниже

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

Например, если имя вашего xib-файла, в котором вы конфигурируете свои IBOultets, совпадает с именем контроллеров, вы можете просто сделать следующее:

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

Здесь у вас будет контроллер с инициализированными IBOutlets.

Для использования раскадровки вы должны инициировать их с раскадровки.Попробуйте подключить контроллеры следующим образом:

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

И вы должны установить ID раскадровки в вашей раскадровке для контроллера, как показано на экране ниже.

ID раскадровки

Также вы можете найти больше информации о том, как правильно просматривать контроллеры с раскадровки здесь

Что такое идентификатор StoryBoard и как я могу его использовать?

0 голосов
/ 12 ноября 2018

Полагаю, вы просто хотите показать PostalViewController, если пользователь вошел в систему. Если пользователь не вошел в систему, вы хотите показать только HomePageViewController. Сначала удалите эти строки из делегата приложения, вам это не нужно:

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

Теперь удалите весь класс контроллера навигации. Вам это не понадобится, потому что вы будете делать все это в HomePageViewController. Теперь в файле swift HomePageViewController добавьте это в viewDidLoad ()

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

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

В конце установите переход от HomePageViewController к PostalViewController

enter image description here enter image description here

и установите его идентификатор как segueToPostal

enter image description here

Если вы не хотите, чтобы пользователь мог вернуться назад из контроллера почтового представления, вы можете просто вставить PostalViewController в новый NavigationController. Затем просто установите segue из HomePageViewController на этот NavigationController и установите идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...