Невозможно изменить настройки для обновления пользовательского интерфейса через делегатов. - PullRequest
0 голосов
/ 02 января 2019

Я уже давно пытаюсь использовать различные методы, чтобы получить изменения на моей странице настроек для запуска обновления пользовательского интерфейса на моей главной странице без какого-либо успеха.

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

class MainViewController: UIViewController, CLLocationManagerDelegate {

    var settingsDelegate: SettingsViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        settingsDelegate.delegate = self
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Not called when i flip between views via Navbar (suggested that i use this function to setup the delegate)
        print(segue.destination)
    }


extension MainViewController: SettingsDelegate {
    //MARK: SettingsDelegate

    func onChangeAltitudeUnits(unitType: Int) {
        // 0 imperial, 1 metric
        // This NEVER gets printed..
        print("new Unit type \(unitType)")
        unitAltitude = unitType
        displayAltitudes((allLocations.last?.altitude) ?? 0)
        print("new Unit type \(unitType)")
    }

}


class SettingsViewController: UITableViewController {

    weak var delegate: SettingsDelegate?
    /*....Other Stuff...*/

    @IBAction func altitudeUnitsChanged(_ sender: UISegmentedControl) {
        let selectedIndex = AltitudeUnits.selectedSegmentIndex

        defaults.set(selectedIndex, forKey: "AltitudeUnits")
        delegate?.onChangeAltitudeUnits(unitType: selectedIndex)
        // This ALWAYS gets printed
        print("Alt unit changed \(AltitudeUnits.selectedSegmentIndex)")
    }
}

protocol SettingsDelegate: class {

    func onChangeSlopeUnits(unitType: Int)
    func onChangeAltitudeUnits(unitType: Int)
    func onChangeDistanceUnits(unitType: Int)
}

enter image description here введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 02 января 2019
var settingsDelegate: SettingsViewController?

... это не ссылка на контроллер вида, который delegate вы хотите установить. Похоже, это просто nil.

Также переопределено prepare(for:sender:) не вызывается, потому что вы не выполняете никаких переходов при переключении между вкладками


Поскольку вы используете контроллер панели вкладок и хотите установить делегаты между его контроллерами встраивания, вы должны установить делегат определенного контроллера представления из массива viewControllers массива

контроллера панели вкладок.
func setDelegate() {
    guard let tabBarController = tabBarController, let thirdVC = tabBarController.viewControllers?[2] as? SettingsViewController else { return }
    thirdVC.delegate = self
}

затем вызовите этот метод в MainViewController переопределенном viewDidLoad

0 голосов
/ 02 января 2019

установите ваши настройки класса при подготовке к переходу, как показано ниже:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       let destinationControler = segue. destination as! SettingsViewController
       destinationControler.delegate = self
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...