Проблема при выполнении перехода от табличного представления к контроллеру представления - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь выполнить переход от 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" Выдает

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

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

Ответы [ 3 ]

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

В методе 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 голос
/ 01 мая 2019

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

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

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

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