#ios #arrays #swift
#iOS #массивы #swift
Вопрос:
У меня есть массив в одном контроллере просмотра, который я хочу отправить двум другим контроллерам просмотра — я делаю это через prepareForSegue:
var userId = ""
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let FollowersUsersViewController = segue.destination as! FollowersUsersViewController
FollowersUsersViewController.followersUserId = userId
let FollowingUsersViewController = segue.destination as! FollowingUsersViewController
FollowingUsersViewController.followingUserId = userId
}
Для других 2 контроллеров просмотра я вызываю массив следующим образом:
Контроллер просмотра 1:
var followersUserId = String()
let followersProfileId = followersUserId
Контроллер просмотра 2:
var followingUserId = String()
let followingProfileId = followingUserId
Кажется, это работает, когда я отправляю его на один из контроллеров просмотра (и комментирую другой), но тогда при запуске приложения работает только одна из кнопок. Когда я делаю это для обоих контроллеров просмотра (как указано выше), я получаю Thread 1: signal SIGABRT
ошибку — как это может работать для обоих?
Ценю любую помощь 🙂
Комментарии:
1. У вас есть одна кнопка, которая переходит к
FollowersUsersViewController
, и другая кнопка, которая переходит кFollowingUsersViewController
?
Ответ №1:
Это сбой, потому что вы пытаетесь использовать неправильный контроллер просмотра. Это за одну итерацию segue.destination
либо FollowersUsersViewController
, либо FollowingUsersViewController
.
Вы произвели его условное приведение перед использованием.
Попробуйте этот код
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let controller = segue.destination as? FollowersUsersViewController {
controller.followingUserId = userId
} else if let controller = segue.destination as? FollowingUsersViewController {
controller.followingUserId = userId
}
}
Ответ №2:
Одна вещь, которую вы могли бы сделать, чтобы улучшить этот код, — заставить оба VC соответствовать протоколу, который обеспечивает присутствие этой переменной:
protocol UserIdController {
var userId: UUID { get set }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let viewController = segue.destination as? UserIdController {
viewController.userId = userId
}
}
Это было бы менее описательно, но гораздо более элегантно и похоже на swift.