2015-02-10 92 views
14

我試圖做也許最簡單和更令人困惑的事情之一直到現在 我想開發自己的應用程序,爲了做到這一點,我需要能夠通過根據該行的用戶點擊的一些信息(這是斯威夫特lenguage)從TableView發送數據到DetailView Swift

我們有一個RootViewController的(表視圖)和DetailViewController(1個標籤和1個圖像) enter image description here

(我們認爲)

這裏是代碼:

@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! 

@IBOutlet weak var imgCar: UIImageView! 

override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 

    // Configure the view for the selected state 
} 

class DetailViewController: UIViewController { 



    @IBOutlet weak var lblDetail: UILabel! 

    @IBOutlet weak var imgDetail: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

的問題是:

如果用戶點擊法拉利458,該lblDetail在DetailViewController會顯示:法拉利458是一個超級汽車能夠達到325公里/小時......(無論我們想要什麼) 和imgDetail將能夠顯示汽車的圖像(無論我們想要的)

如果用戶點擊布加迪威龍現在磅lDetail告訴我們:Bugatti Veyron是一款完美超級運動機器。這是世界上最快的車之一....

imgDetail我們展示了這款車的形象

與所有汽車取決於我們點擊

哪一行,我知道同樣的事情的工作是圍繞prepareForSegue功能在第一視圖控制器,但我想了很多不同的方式,使其成爲可能和任何運行良好

我們如何做到這一點???

+0

當我試圖傳遞一個字符串到另一個視圖控制器來存儲未來名稱時,我也面臨同樣的問題。我偶然發現了這篇清楚解釋它的文章。 http://www.codingexplorer.com/segue-swift-view-controllers/ – Mechanic 2015-05-04 20:14:48

回答

35

這是給你的例子:

var valueToPass:String! 

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) { 
    println("You selected cell #\(indexPath.row)!") 

    // Get Cell Label 
    let indexPath = tableView.indexPathForSelectedRow! 
    let currentCell = tableView.cellForRowAtIndexPath(indexPath)! as UITableViewCell 

    valueToPass = currentCell.textLabel.text 
    performSegueWithIdentifier("yourSegueIdentifer", sender: self) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){ 

    if (segue.identifier == "yourSegueIdentifer") { 
     // initialize new view controller and cast it as your view controller 
     var viewController = segue.destinationViewController as AnotherViewController 
     // your new view controller should have property that will store passed value 
     viewController.passedValue = valueToPass 
    } 
} 

但是不要忘了創建passedValue變量到您的DetailViewController

這只是將數據從一個viewController傳遞到另一個viewController的示例,您可以根據需要使用此示例傳遞數據。

欲瞭解更多信息,請參閱此鏈接。

Passing values between ViewControllers based on list selection in Swift

Use didSelectRowAtIndexPath or prepareForSegue method for UITableView?

Swift: Pass UITableViewCell label to new ViewController

https://teamtreehouse.com/forum/help-swift-segue-with-variables-is-not-working

可能這會幫助你。

雨燕3.0

var valueToPass:String! 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    print("You selected cell #\(indexPath.row)!") 

    // Get Cell Label 
    let indexPath = tableView.indexPathForSelectedRow! 
    let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell 

    valueToPass = currentCell.textLabel?.text 
    performSegue(withIdentifier: "yourSegueIdentifer", sender: self) 
} 

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){ 

    if (segue.identifier == "yourSegueIdentifer") { 
     // initialize new view controller and cast it as your view controller 
     var viewController = segue.destination as! AnotherViewController 
     // your new view controller should have property that will store passed value 
     viewController.passedValue = valueToPass 
    } 
} 
+0

嗨Dharmesh Kheni,首先thx非常仁慈 當然,所有你寫的幫助我多瞭解一點,但仍然doesn 「T運行我在尋找 現在應用程序知道選擇哪一行的樣子,但我需要知道如何改變lblDetail和imgDetail 小號 – FactorJose 2015-02-10 14:22:48

+0

對不起...... 不知何故,我想我們需要一個if語句或類似的東西......但在哪裏?如何? = S 我是初學者,接受我的道歉 – FactorJose 2015-02-10 14:24:20

+0

只需將變量創建爲DetailViewController,當從segue傳遞值並將該值賦予該變量並在此之後,您可以將值顯示到DetailViewController中時,它可以保存值。 – 2015-02-11 04:36:03

0

它的簡單,我加入一個語句上面的回答。 爲了詳細視圖標籤獲得所選擇的車名,

lblDetail.text = passedValue

您可以在viewDidLoad中添加一行的代碼()FUNC您的詳細視圖。 passedValue包含用戶選擇的汽車名稱(在prepareForSegue中指定),那麼您可以指定給您的detailedView標籤。

希望它有幫助!

0

如果從原型細胞拖動賽格瑞(在界面生成器),你的下一個視圖控制器,並設置其SEGUE標識符「你Segue公司標識」,你也可以用這個快捷方式做到這一點:

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 
    } 
} 

而且您也不需要在didSelectRowAtIndexPath()中的performSegueWithIdentifier(),也不需要此Table View方法。

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

var valueToPass: String! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    yourLabel.text = valueToPass 
} 

設置標籤的價值是非常重要的後它從故事板初始化。這意味着,您無法直接在之前的視圖控制器的prepareForSegue()中設置標籤,因此需要將其與valueToPass一起傳遞。

相關問題