我用必须在其他ViewController上打开的新闻提要制作应用。但是无法通过segue传递数据。
带有新闻源的Viewcontroller
class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var titlenews = ""
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "newsfeedCell", for: indexPath) as! NewsFeedCell
cell.newsfeed_title.text = self.news?[indexPath.item].headline
cell.newsfeed_topic.text = self.news?[indexPath.item].topic
cell.newsfeed_time.text = timetime(from: (self.news?[indexPath.item].time)!)
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("tableview")
let vc = storyboard?.instantiateViewController(withIdentifier: "newsBody") as? NewsBody
vc?.labeltext = (self.news?[indexPath.item].headline)!
print((self.news?[indexPath.item].headline)!)
self.navigationController?.pushViewController(vc!, animated: true)
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.news!.count
} //number of rows
@IBOutlet weak var tableview: UITableView!
var news: [Newsfeed]? = []
override func viewDidLoad() {
super.viewDidLoad()
getJSON()
}
func getJSON(){
///Here all do right
}
}
必须从新闻提要中接收数据的Viewcontroller
class NewsBody: UIViewController {
@IBOutlet weak var testLabel: UILabel!
var labeltext = ""
override func viewDidLoad() {
super.viewDidLoad()
print(labeltext)
testLabel.text = labeltext
}
}
print(labeltext)
显示NewsBody
收到空值或什么都没有。
但是print((self.news?[indexPath.item].headline)!)
中的SecondViewController
表明我试图推动适当的价值。
我在两次操作之间做错了什么? segue和数据传递有什么问题?
答案 0 :(得分:4)
似乎instantiateViewController(withIdentifier: "newsBody")
会在后台触发视图加载。从理论上讲,它不应该这样做,但可以针对您的情况做到这一点。
这意味着将在执行viewDidLoad()
之前调用vc?.labeltext = (self.news?[indexPath.item].headline)!
。
我建议您执行以下操作。
class NewsBody: UIViewController {
@IBOutlet weak var testLabel: UILabel!
var labeltext: String? {
didSet { updateUI() }
}
override func viewDidLoad() {
super.viewDidLoad()
updateUI()
}
private func updateUI() {
testLabel.text = labeltext
}
}
这样,如果您在加载视图后设置了labeltext
属性,它仍然会触发UI更新。并且,如果您在加载视图之前设置了labeltext
属性,则将在调用viewDidLoad()
时立即进行设置。
顺便说一句,您这里没有使用segues。但是即使这样做,您也可以轻松使用与我建议的方法相同的方法,因为它使您不必再考虑属性更新是否会更新UI。
还请注意,我将该属性设置为可选。它将使您避免强行施压,而只需
vc?.labeltext = self.news?[indexPath.item].headline
UILabel.text
也是可选的String
属性,因此它们可以很好地配合使用。