#ios #swift #xcode #uitabbarcontroller
Вопрос:
Итак, я хочу предварительно выбрать некоторые данные, необходимые в контроллерах представлений, связанных с контроллером панели вкладок, когда пользователь переходит со страницы входа на домашнюю страницу (контроллер панели вкладок существует между этими двумя контроллерами представлений). Я извлекаю данные в пользовательском классе TabBarController и использую следующий код для их отправки (не работает):
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination is Profile { // Profile = one of the view controllers in the tab bar
let vc = segue.destination as? Profile
vc?.uid = self.userID
vc?.name = self.name
vc?.skills = self.skillSet
}
}
Каков наилучший способ сделать это? Пожалуйста, обратите внимание, что я не могу предварительно выбрать данные перед контроллером панели вкладок, так как это страница входа в систему. Если я предварительно выберу данные страницы профиля на домашней странице (контроллер панели вкладок {главная страница, поиск, профиль}), как я могу перенести их на другой контроллер представления (в профиль) на той же панели вкладок?
Ответ №1:
Каков наилучший способ сделать это?
- Я полагаю, что как только вы выполните вход в систему (на экране входа в систему), у вас будет идентификатор пользователя и другие данные, связанные с этим пользователем, поэтому внутри контроллера входа вы добавили код для создания контроллера панели вкладок в качестве начального контроллера.
- Поэтому, исходя из этого, лучше всего хранить данные пользователя в контроллере панели вкладок.
- Поэтому, как только вы введете данные в контроллер панели вкладок (либо с экрана входа, либо с главного экрана), вы сможете получить данные пользователя в любом корневом контроллере (главная страница, поиск, профиль), который находится внутри панели вкладок, с помощью кода ниже.
struct User { var userID: String? }
class TabbarController: UITabBarController {
var userData: User
}
class HomeController: UIViewController {
var userData: User?
override func viewWillAppear(_ animated: Bool) {
if let tabBar = self.tabBarController as? TabbarController {
self.userData = tabBar.userData
}
}
}
Ответ №2:
Этого можно достичь несколькими способами.
- Использование супервизионного контроллера,
- Использование класса SingleTone, если вы хотите получить доступ к подклассу TabbarViewVontroller, отличному от подкласса TabbarViewVontroller.
- Сохранение в общем расположении, например в константах, если данные небольшие.
- Предварительная выборка данных в одном VC, например, Домой, а затем переход к нужному VC по щелчку мыши.