Проблема с переносом значений в контроллеры в Swift - PullRequest
0 голосов
/ 10 мая 2019

У меня в приложении несколько экранов и контроллеров. Первый экран - это экран с кнопкой и перемещает пользователя к следующему виду входа с именем пользователя, паролем и кнопкой входа. На контроллере у меня есть функция onClickButton, и когда у меня есть хорошие данные, я запрашиваю сервер с этими данными.

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

Моя структура такая

Представление входа в систему -> Представление SecondLogin и LoginViewController -> TabBarController -> NavigationController -> Представление таблицы с помощью TableViewController

Мой код

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "afterLoginView" {
        if let secondVC = segue.destination as? TabBarViewController {
            secondVC.finalName = self.username
        }
    }  
}

Когда я хочу перенести мои данные непосредственно в tableViewController, у меня появляется ошибка

Резьба 1: сигнал SIGABRT

Я не понимаю, что я делаю не так

Ответы [ 3 ]

1 голос
/ 10 мая 2019

Вам понадобятся эти значения почти во всех контроллерах представления. Создайте одноэлементный класс для хранения пользовательских значений, таких как

class UserDetails: NSObject, Codable {
    static let shared = UserDetails()
    private override init() {
        super.init()
    }
    var finalName: String?
    var otherDetails: String?
}

Теперь, когда вы получите ответ от API входа в систему, присвойте значения этому одноэлементному классу.

UserDetails.shared.finalName = "something"//Name received from server callback

Теперь вы можете получить доступ к этим значениям из любого контроллера представления.

class TableViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print(UserDetails.shared.finalName)
    }
}
0 голосов
/ 11 мая 2019

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

Это отличный пример того, почему вы должны держать M в MVC. Когда вы получите ответ от сервера, сохраните возвращенные данные в вашей модели данных. (Если у вас нет модели данных, вы должны создать ее.) Когда контроллер представления получает некоторые данные от пользователя, такие как имя пользователя, он должен сохранить их в модели. Нет особых оснований для передачи необработанных данных туда и обратно между контроллерами представления напрямую ... просто убедитесь, что все ваши контроллеры представления имеют ссылку на модель, и они должны получать и устанавливать значения там, где это необходимо.

Такой подход сделает ваш код более гибким. Это позволяет контроллерам представления беспокоиться о том, что им необходимо для выполнения своей работы, и избавляет их от заботы о том, что нужно другим контроллерам представления.

Моя структура такая

Представление входа в систему -> Представление SecondLogin и LoginViewController -> TabBarController -> NavigationController -> Представление таблицы с помощью TableViewController

Возможно, имеет смысл загрузить контроллер панели вкладок и затем представить контроллер (ы) представления входа в систему модально. Все контроллеры представления, управляемые контроллером панели вкладок, могут быть настроены так, чтобы отказываться делать что-либо полезное до тех пор, пока необходимые им данные не будут присутствовать в модели данных, и это позволяет контроллеру панели вкладок быть корневым контроллером представления. Это облегчит настройку модели для каждого из его дочерних контроллеров представления при запуске приложения, а затем приложение может представить модальные контроллеры представления входа в систему, также настроенные со ссылками на модель.

0 голосов
/ 10 мая 2019

У вас есть работа, чтобы добраться до правильного контроллера вида. Поскольку ваш переход только указывает на UITabBarViewController, вы должны вставить еще один оператор guard или if/let, чтобы получить вас к UINavigationController, а затем еще один, чтобы, наконец, привести вас к UITableViewController, где вы можете на самом деле ссылаются на вашу finalName переменную.

Это будет выглядеть примерно так:

if let secondVC = segue.destination as? TabBarViewController {
    if let navCon = secondVC.viewController[0] as? UINavigationController {
        if let tableVC = navCon.topViewController as? nameOfYourTableVC {
            tableVC.finalName = self.username
}

Код не проверен, только что набран на моей голове, поэтому, пожалуйста, действуйте с осторожностью. Проблемы, такие как то, какая вкладка является правильным NavController, также должны быть решены.

Вам нужно использовать фактическое имя вашего класса tableView в последнем if / let. Общий UITableViewController не будет включать ваши пользовательские переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...