#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. Всякий раз, когда вы отправляете данные обратно и / или изменяете данные (с помощью функции), вам нужен делегат. Или закрытия, но делегаты будут в порядке.