Swift: использование делегатов для отправки данных на другой контроллер представления

#ios #swift #delegates

#iOS #swift #делегаты

Вопрос:

Как мне использовать делегатов для отправки данных на другой контроллер представления, а затем отобразить их в представлении коллекции? Моя проблема заключается в перемещении массива с помощью делегатов.

Ниже приведен пример того, над чем я работаю.

Когда я использую usersList в ThirdViewController, я получаю сообщение об ошибке «Неожиданно найдено nil при неявном развертывании необязательного значения»

 
protocol ExampleDelegate {
    func delegateFunction(usersArray: Array<User>)   
}


class ViewController: UIViewController {

  private var model: Users = ViewController.createAccount()
  var exampleDelegate: ExampleDelegate?


  @IBAction func ShowUsers(_ sender: UIButton) {
        let ShowUsersVC = storyboard?.instantiateViewController(identifier: "ThirdViewController") as! ThirdViewController

        var userList: Array<User> = model.listOfUsers
        exampleDelegate?.delegateFunction(usersArray: userList )

        present(ShowUsersVC, animated: true)
        
    }

}

  
 
class ThirdViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!

    var usersList: Array<User>!


    override func viewDidLoad() {
           super.viewDidLoad()

    let GetUsersVC = storyboard?.instantiateViewController(identifier: "ViewController") as! ViewController
        GetUsersVC.showMomentsDelegate = self

        collectionView.dataSource = self
        collectionView.delegate = self

    }
}


extension ThirdViewController: ExampleDelegate {
    func delegateFunction(usersArray: Array<User>)  
    usersList = usersArray
}

  

Ответ №1:

В этом случае вам не нужны делегаты. Вы отправляете данные вперед, поэтому просто сделайте это так:

 class ViewController: UIViewController {

  private var model: Users = ViewController.createAccount()
  var exampleDelegate: ExampleDelegate?


  @IBAction func showUsers(_ sender: UIButton) {
        let showUsersVC = storyboard?.instantiateViewController(identifier: "ThirdViewController") as! ThirdViewController

        var userList: Array<User> = model.listOfUsers
        showUsersVC.usersList = userList /// pass the data!

        present(showUsersVC, animated: true)
        
    }
}
  

Также в Swift вы должны использовать строчные объекты, такие как userList , а также функции, подобные showUsers .

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

1. Спасибо! Нужен ли мне делегат только для отправки данных обратно на первый контроллер представления? Или если данные, которые я отправляю обратно, изменяют данные в модели?

2. Всякий раз, когда вы отправляете данные обратно и / или изменяете данные (с помощью функции), вам нужен делегат. Или закрытия, но делегаты будут в порядке.