ios - 无法通过 segue 传递数据
问题描述
我使用新闻提要制作应用程序,该应用程序必须在其他 ViewController 上打开。但不能通过 segue 传递数据。
带有新闻源的视图控制器
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
}
}
必须从新闻提要接收数据的视图控制器
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和数据传递有什么问题?
解决方案
似乎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
属性,因此它们可以很好地配合使用。
推荐阅读
- performance - 在 SICStus Prolog 中测量时间
- lstm - 在 Pytorch NLP 示例词性标记中获得不同的输出
- mysql - 无法连接到 AWS RDS MySQL 实例时,在 Heroku 上运行的 Flask 服务器不会引发错误
- php - 遍历json并显示在表格中
- swift - 代码 如果数字大于 x,则使 y = 数量
- laravel - Vuejs - 单击组件中的按钮时未触发事件
- objective-c - 当手表应用程序处于后台时,WCSession 不会从 iPhone 向 Watch 发送消息
- ios - 计算属性 - 如何仅在主线程上使用?
- android - 实现 AutoCompleteTextView 的更好解决方案?
- c# - 月日年错误