Swift: передача значения из одного класса в другой или, в частности, из класса ViewController в NSObject

Как передать значение из viewDidLoad в UIViewController в другой класс - NSObject.

В основном у меня есть класс MainViewController, а внутри класса находится панель навигации. Я хотел получить доступ к высоте панели навигации и передать значение другому файлу / классу -> класс SettingsLauncher: NSObject.

Единственный способ получить доступ к высоте панели навигации - внутри viewDidLoad класса MainViewController. Это может быть проблемой!

SettingsLauncher должен получить значение высоты панели навигации, чтобы он мог отображать небольшой вид прямо под панелью навигации.

Из кода ниже:

NavBarHeight получает высоту панели навигации. Как я могу передать это значение другому моему классу (SettingsLauncher)?

let statusBarHeight = UIApplication.shared.statusBarFrame.size.height
let navBarHeight= self.navigationController?.navigationBar.frame.height ?? 0.0
let topBarHeight = statusBarHeight + navBarHeight

person N. Der    schedule 23.12.2018    source источник


Ответы (2)


Создайте структуру в классе MainViewController, например:

class MainViewController: UIViewController {

    struct structure {
        static var topBarHeight = CGFloat()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let statusBarHeight = UIApplication.shared.statusBarFrame.size.height
        let navBarHeight= self.navigationController?.navigationBar.frame.height ?? 0.0
        structure.topBarHeight = statusBarHeight + navBarHeight
    }
}

Затем используйте его для доступа к значению из объекта SettingsLauncher:

class SettingsLauncher {
    var navHeight = MainViewController.structure.topBarHeight
}
person Natália Mendonça    schedule 23.12.2018

Создайте свойство в SettingsLauncher, например navHeight, затем

class SettingsLauncher {
    var navHeight: CGFloat?
}

In MainViewController,

class MainViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let statusBarHeight = UIApplication.shared.statusBarFrame.size.height
        let navBarHeight= self.navigationController?.navigationBar.frame.height ?? 0.0
        let topBarHeight = statusBarHeight + navBarHeight

        let settings = SettingsLauncher()
        settings.navHeight = topBarHeight //navBarHeight
    }
}
person Bappaditya    schedule 23.12.2018
comment
Благодарю за ваш ответ. Однако, когда я печатаю navHeight, он возвращает nil. Я что-то упускаю? - person N. Der; 23.12.2018
comment
где ты печатаешь? В MainViewController или SettingsLauncher? - person Bappaditya; 23.12.2018
comment
Распечатываю на обоих. Он отлично работает с MainViewController, но из SettingsLauncher выводит 'nil' - person N. Der; 23.12.2018
comment
не могли бы вы поделиться фрагментом кода класса SettingsLauncher? - person Bappaditya; 23.12.2018
comment
класс SettingsLauncher: NSObject, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {var navHeight = MainViewController.structure.topBarHeight let collectionView: UICollectionView = {let layout = UICollectionViewFlowvLayout () let coutlection () class SettingsLauncher {var navHeight: CGFloat? } func showSettings () {let mainViewController = MainViewController () print (navHeight, ????????) - person N. Der; 24.12.2018