从 tableview 到 viewcontroller 执行 segue 时出现问题
Problem performing segue from tableview to viewcontroller
我正在尝试从带有新闻的 UITableView
执行转接。如果您推送其中一条新闻,它会对您选择的特定新闻执行 segue。
这很容易,我已经做了几次...但是我不知道这次我做错了什么。
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 中的 segue 是这样的:
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"
抛出
fatal error: Unexpectedly found nil while implicitly unwrapping an
Optional value.
而且我不知道如果继续下去会怎样。尝试初始化目标中的其余标签时会发生同样的问题。
这一行就是问题所在
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
。
通常,您不应在 prepareForSegue
中设置目标 VC 的视图属性。您应该在 NewsDetailViewController
:
中声明一个 newsTitleText
属性
var newsTitleText: String!
并改为设置此 属性:
destination.newsTitleText = "whatevertitle"
然后在viewDidLoad
中设置newsTitle.text
:
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
.
我正在尝试从带有新闻的 UITableView
执行转接。如果您推送其中一条新闻,它会对您选择的特定新闻执行 segue。
这很容易,我已经做了几次...但是我不知道这次我做错了什么。
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 中的 segue 是这样的:
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"
抛出
fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value.
而且我不知道如果继续下去会怎样。尝试初始化目标中的其余标签时会发生同样的问题。
这一行就是问题所在
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
。
通常,您不应在 prepareForSegue
中设置目标 VC 的视图属性。您应该在 NewsDetailViewController
:
newsTitleText
属性
var newsTitleText: String!
并改为设置此 属性:
destination.newsTitleText = "whatevertitle"
然后在viewDidLoad
中设置newsTitle.text
:
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
.