【问题标题】:Can't pass data via segue无法通过 segue 传递数据
【发布时间】:2018-09-16 01:28:19
【问题描述】:

我使用新闻提要制作应用程序,该应用程序必须在其他 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 接收空值或什么也不接收。

SecondViewController 内部的print((self.news?[indexPath.item].headline)!) 表明我试图推动适当的价值。

我在此操作之间做错了什么?数据的 segue 和 pass 有什么问题?

【问题讨论】:

  • 你在 storyboard 中从 viewController 到 SecondViewController 添加了 sague 吗?
  • 您当前的代码中没有使用 segue。你正在用 pushViewController 的旧方式做自己,但没有做 segue。

标签: ios swift segue


【解决方案1】:

似乎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 属性,因此它们可以很好地配合使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2019-05-11
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多