Я пытаюсь выполнить переход от 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 ответа
Эта линия является проблемой
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
}
}
В методе 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
}
Когда вызывается метод prepare(for:sender:)
, NewsDetailViewController
еще не загрузил представление, поэтому вы не можете установить текст на метке. Вам нужно создать еще одно свойство NewsDetailViewController
, например var newsTitleText: String?
. Тогда в viewDidLoad
вы можете позвонить newsTitle.text = newsTitleText
.
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.