无法通过Segue传递数据

时间:2018-08-22 13:04:07

标签: ios swift segue

我用必须在其他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和数据传递有什么问题?

1 个答案:

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