Отправить массив с 1 контроллера просмотра на 2 других отдельных контроллера просмотра

#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.