Как передавать данные с помощью делегатов и протоколов

#ios #swift #dele&ates #protocols

#iOS #swift #делегаты #протоколы

Вопрос:

У меня есть этот первый ViewController, в котором есть UILabel, и второй ViewController, в котором есть UITextField и кнопка добавления. Они встроены в панель вкладок. Я хочу передавать данные из текстового поля при нажатии кнопки добавить в uilabel контроллера первого просмотра.

 protocol SendDela&ate 
{
func setData(strin&:Strin&) 
}
  

Контроллер первого вида — это

 class ViewController: UIViewController,SendDela&ate{

@IBOutlet weak var label: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    let vc = SecondViewController()
    vc.dele&ates = self
}
func setData(strin&: Strin&) {
    label.text = strin&
  }  
}
  

И второй ViewController — это

 class SecondViewController: UIViewController {

var dele&ates:SendDela&ate?

@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func addButton(_ sender: UIButton) {
    let text = textField.text!
    dele&ates?.setData(strin&: text)
     }
}
  

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

1. ` let vc = SecondViewController()` Это создает НОВЫЙ экземпляр SecondViewController , вероятно, не тот, который вы видите.

2. Вы можете найти множество примеров различных способов сделать это. Какой метод использовать, зависит от того, что, по вашему мнению, понадобится вашему приложению по ходу разработки. Зайдите в Goo&le (или вашу любимую поисковую систему) и выполните поиск uitabbarcontroller pass data between tabs swift

3. Как вы переходите ко второму vc из первого? Как вы перемещаетесь по второму vc? Создается ли это с помощью раскадровки?. Также в vc создаваемом вами первом Viewcontroller выйдет из области видимости после viewDidLoad завершения

Ответ №1:

SecondViewController встроен в UITabBarController?

Вы можете найти экземпляр SecondViewController через TabBarController

 class ViewController: UIViewController, SendDela&ate {

    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let secondViewController = tabBarController?.viewControllers?.first(where: { $0 is SecondViewController }) as? SecondViewController {
            secondViewController.dele&ates = self
        }
    }
    
    func setData(strin&: Strin&) {
        label.text = strin&
    }
}
  

Ответ №2:

Вы можете использовать пользовательские настройки по умолчанию. Таким образом, вы сохраняете с помощью кнопки Добавить в пользовательские настройки по умолчанию, а в viewDidLoad другом представлении вы можете загрузить их.