Я пытаюсь выполнить переход от UITableView с новостями. Если вы нажмете одну из новостей, она перейдет к конкретной новости, которую вы выбрали.

Это легко, и я делал это несколько раз ... но я не знаю, что я делаю не так в этот раз.

NewsDetailViewController выглядит следующим образом:

class NewsDetailViewController: UIViewController {

@IBOutlet weak var newsImage: UIImageView!
@IBOutlet weak var newsTitle: UILabel!
@IBOutlet weak var newsDate: UILabel!
@IBOutlet weak var newsText: UILabel!

var newsLink: String?

override func viewDidLoad() {
    super.viewDidLoad()

    // Hides the navigation bar.
    self.navigationController?.setNavigationBarHidden(true, animated: false)

}


@IBAction func closeNews(_ sender: UIButton) {
       navigationController?.popViewController(animated: true)

}

}

И переход в NewsTableViewController выглядит следующим образом:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    print("you selected the row: \(indexPath.row)")
    tableView.deselectRow(at: indexPath, animated: true)
    self.performSegue(withIdentifier: "goToNewsDetail", sender: self)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "goToNewsDetail" {

        if let destination = segue.destination as? NewsDetailViewController {

            destination.newsLink = "whateverlink"
            destination.newsTitle.text = "whatevertitle"

        }

    }

}

И строка: destination.newsLink = "whateverlink" Работает отлично.

Но строка: destination.newsTitle.text = "whatevertitle" Бросает

фатальная ошибка: неожиданно найден ноль при неявном развертывании необязательного значения.

И я понятия не имею, что делать дальше. Та же проблема возникает при попытке инициализировать остальные метки в месте назначения.

0
jRuMoL 1 Май 2019 в 14:00

3 ответа

Лучший ответ

Эта линия является проблемой

destination.newsTitle.text = "whatevertitle"

Не обращайтесь к выходам целевого vc, так как они еще не загружены, отправьте строку и назначьте ее метке в целевом vc

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToNewsDetail" {
            if let destination = segue.destination as? NewsDetailViewController {
                destination.newsLink = "whateverlink"
                destination.toSend = "whatevertitle"
        }
    }
}
class NewsDetailViewController: UIViewController {
    @IBOutlet weak var newsTitle:UILabel!
    var toSend = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.newsTitle.text = toSend
    }
}
1
Sh_Khan 1 Май 2019 в 11:04

В методе prepareForSegue метка newsTitle все еще не инициализирована, поэтому это nil.

Как правило, вы не должны устанавливать свойства представления целевого VC в prepareForSegue. Вы должны объявить свойство newsTitleText в NewsDetailViewController:

var newsTitleText: String!

И установите это свойство вместо:

destination.newsTitleText = "whatevertitle"

Затем установите newsTitle.text в viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    // Hides the navigation bar.
    self.navigationController?.setNavigationBarHidden(true, animated: false)
    newsTitle.text = newsTitleText
}
1
Sweeper 1 Май 2019 в 11:06

Когда вызывается метод prepare(for:sender:), NewsDetailViewController еще не загрузил представление, поэтому вы не можете установить текст на метке. Вам нужно создать еще одно свойство NewsDetailViewController, например var newsTitleText: String?. Тогда в viewDidLoad вы можете позвонить newsTitle.text = newsTitleText.

1
beyerss 1 Май 2019 в 11:06