Как я могу передать значение текстового поля от одного видоконтроллера второму видоконтроллеру (macOS Swift)?

#swift #macos #function #textfield #iboutlet

Вопрос:

Я работаю над проектом, и мой файл ViewController начинает становиться очень длинным. Следовательно, я хочу определить все свои функции во втором ViewController, чтобы я мог удалить некоторый код из моего первого ViewController. Это работает, за исключением случаев, когда я пытаюсь сослаться на значение из текстового поля, определенного в моем FirstViewController, оно возвращает ноль. Я новичок в разработке macOS, поэтому был бы очень признателен за простую/конкретную обратную связь.

Это пример моего первого ViewController (он инициализирует переменные и использует функции).:

 class FirstViewController: NSViewController, NSTextFieldDelegate {

    @IBOutlet weak var firstName: NSTextField!
    let lastName = "Smith"  

    @IBAction func buttonPressed(_ sender: Any) {
        SecondViewController().printUserName()  
    }
}
 

Это мой второй ViewController (он определяет функции):

 class SecondViewController: NSViewController, NSTextFieldDelegate {

    func printUserName() {
       print(FirstViewController().firstName!) // this returns nil :(
       print(FirstViewController().lastName) // this returns "Smith" :)
    }
}
 

Комментарии:

1. Вам нужно узнать о классах и экземплярах. Вы создаете новые пустые контроллеры представления, не ссылаясь на существующие.

2. Спасибо вам за ваш ответ. Как я могу обратиться к Первому контроллеру представления без использования сегментов?

3. Некоторые другие параметры-это закрытие, протоколы или уведомления. Вы можете провести исследование плюсов и минусов каждого из них.

4. Спасибо, я займусь этим. Какой самый простой вариант?

5. Без решения вопроса о том, что было бы «хорошим» рефакторингом, если цель состоит в том, чтобы просто удалить файл контроллера представления, вы можете создать extension оф FirstViewController в отдельном файле и поместить туда вспомогательные методы, сохраняя выходы и действия непосредственно в определении класса. Расширение автоматически получит доступ к свойствам и методам класса.

Ответ №1:

Если вы используете UINavigationController для перехода ко второму VC, вы можете просто определить второе представление, а затем получить доступ к переменным в этом представлении.

пример, FirstViewController

 class FirstViewController: NSViewController, NSTextFieldDelegate {

    @IBOutlet weak var firstName: NSTextField!
    let lastName = "Smith"  

    @IBAction func buttonPressed(_ sender: Any) {
        guard let secondView = self.storyboard?.instantiateViewController(identifier: "SecondViewController") as? SecondViewController else {
                return
            }
    self.navigationController?.pushViewController(secondView, animated: false)
    secondView.textValue = firstName.text 
    }
}
 

SecondViewController

 class SecondViewController: NSViewController, NSTextFieldDelegate {

    var textValue: String?

    override func viewDidLoad() {
       printUserName()
    }


    func printUserName() {
       if let text = textValue {
            print(text)
       }
  
    }
}