Текст метки установки XCode из переменной, переданной из другого viewController, вызывает сбой - PullRequest
0 голосов
/ 18 марта 2019

Это код, который представляет следующий VC:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("dismiss completed")
    let user = self.users[indexPath.row]
    performSegue(withIdentifier: "toNewMessage", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let indexPath = tableView.indexPathForSelectedRow

    var vc = segue.destination as! ChatLogController
    vc.user = self.users[(indexPath?.row)!]
}

И это переменная, которая получает данные из предыдущего VC:

var user: User? {
    didSet {
        print(user?.name)
        chatLogTitleLabel.text = user?.name
    }
}

Он говорит, что нашелЗначение nil, когда я пытаюсь установить текст метки, но когда я его печатаю, это правильное значение, а не nil.Как я могу это исправить?

Ответы [ 4 ]

0 голосов
/ 18 марта 2019

Как уже говорили другие, это происходит потому, что представление и все выходы еще не были загружены. Вы можете исправить это, установив вместо этого текст метки в viewDidLoad, или вы можете загрузить представление, если оно еще не загружено, в didSet, например:

var user: User? {
    didSet {
        loadViewIfNeeded()
        chatLogTitleLabel.text = user?.name
    }
}
0 голосов
/ 18 марта 2019

Розетки не подключены в тот момент, когда вызывается код внутри prepare(for:sender:).Вам нужно установить text вашего ярлыка после того, как он есть, например, в viewDidLoad

var user: User?

override func viewDidLoad() {
    super.viewDidLoad()
    chatLogTitleLabel.text = user?.name
}

В любом случае, когда вы выполняете переход, вы можете передать выбранный User какsender, а затем в prepare(for:sender:) убавить его

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "toNewMessage", sender: users[indexPath.row])
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toNewMessage" {
        var vc = segue.destination as! ChatLogController
        vc.user = sender as! User
    }
}
0 голосов
/ 18 марта 2019

Это происходит из-за

var user: User? {
    didSet {
        print(user?.name)
        chatLogTitleLabel.text = user?.name
    }
}

Вы устанавливаете значение chatLogTitleLabel.text до его инициализации.Вы должны сделать это после загрузки представления.в viewDidLoad / viewWillApper или viewDidAppear.или загрузите вид следующего контроллера, прежде чем присваивать значение user.

0 голосов
/ 18 марта 2019

Удалите didSet и установите это внутри viewDidLoad

chatLogTitleLabel.text = user?.name

Проблема в этом

vc.user = self.users[(indexPath?.row)!]

запускает установку метки, которая в данный момент равна нулю, так как все выходы равны нулю до тех пор, пока vc не будет загружен / представлен

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