#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)
}
}
}