亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將數據從TableView發送到DetailView Swift

將數據從TableView發送到DetailView Swift

PIPIONE 2019-12-03 09:45:14
直到現在我想開發自己的App之前,我都試圖為我做一件最簡單,更令人困惑的事情,為了做到這一點,我需要能夠根據行用戶點擊的方式傳遞一些信息(這是Swift語言)我們有一個RootViewController(表視圖)和DetailViewController(帶有1個標簽和1個圖像) 在此處輸入圖片說明(我們的觀點)這是代碼:@IBOutlet weak var tableView: UITableView!var vehicleData : [String] = ["Ferrari 458" , "Lamborghini Murcielago" , "Bugatti Veyron", "Mercedes Benz Biome"]override func viewDidLoad() {    super.viewDidLoad()    // Do any additional setup after loading the view, typically from a nib.    var nib = UINib(nibName: "TableViewCell", bundle: nil)    tableView.registerNib(nib, forCellReuseIdentifier: "cell")}func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {    return vehicleData.count}func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    let cell:TableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as TableViewCell    cell.lblCarName.text = vehicleData[indexPath.row]    cell.imgCar.image = UIImage(named: vehicleData[indexPath.row])    return cell   }func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {    performSegueWithIdentifier("DetailView", sender: self)} override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {    if(segue.identifier == "DetailView") {        var vc = segue.destinationViewController as DetailViewController    }}func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {    return 100}自定義TableViewCell類(具有帶有單元格的xib文件)class TableViewCell: UITableViewCell {@IBOutlet weak var lblCarName: UILabel!問題是:如果用戶單擊Ferrari 458,則DetailViewController中的lblDetail將顯示:Ferrari 458是一輛超級跑車,能夠達到325 km / h……(無論我們想要什么),imgDetail可以顯示圖像(無論如何)我們想要的)如果用戶單擊布加迪威龍,則lblDetail向我們顯示:布加迪威龍是一款完美的超級運動機。它是世界上最快的汽車之一。imgDetail向我們展示這輛車的圖像所有汽車都一樣,這取決于我們點擊了哪一行我知道工作是圍繞第一個View Controller中的prepareForSegue函數進行的,但是我正在嘗試許多不同的方法來使其成為可能,并且一切正常我們如何做到這一點???
查看完整描述

3 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

這可能是另一種解決方案,在didSelectRowAtIndexPath方法中沒有太多代碼。請注意,雖然它看起來更干凈,并且我們不需要額外的變量valueToPass,但這可能不是最佳實踐,因為performSegue方法中的sender參數應該是發起segue(或nil)的實際對象。


// MARK: UITableViewDelegate methods


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    tableView.deselectRow(at: indexPath, animated: true)


    performSegue(withIdentifier: "goToSecondVC", sender: indexPath)

}


// MARK: UIViewController methods


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "goToSecondVC" {    

        if segue.destination.isKind(of: CarDetailsController.self) {

            let secondVC = segue.destination as! CarDetailsController


            let indexPath = sender as! IndexPath


            secondVC.passedValue = carsArray[indexPath.row]

        }

    }

}


查看完整回答
反對 回復 2019-12-03
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

如果將Segue從原型單元(在Interface Builder中)拖到下一個View Controller并將其Segue標識符設置為“ Your Segue Identifier”,則也可以使用以下快捷方式進行操作:


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "Your Segue Identifier" {

        let cell = sender as! YourCustomCell

        let vc = segue.destination as! PushedViewController

        vc.valueToPass = cell.textLabel?.text // or custom label

    }

}

而且你也不需要performSegueWithIdentifier()的didSelectRowAtIndexPath(),也沒有這個表視圖方法。


在PushedViewController.swift(下一個視圖控制器)中:


var valueToPass: String!


override func viewDidLoad() {

    super.viewDidLoad()

    yourLabel.text = valueToPass

}

從情節提要板初始化標簽后,設置標簽的值很重要。這意味著您不能prepareForSegue()直接在先前的View Controller中設置標簽,因此需要通過進行傳遞valueToPass。


查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 629 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號