2015-02-10 6 views
14

पर डेटा भेजें, मैं अब तक मेरे लिए सबसे सरल और अधिक भ्रमित चीजों में से एक करने की कोशिश कर रहा हूं मैं अपनी खुद की ऐप विकसित करना चाहता हूं, और ऐसा करने के लिए मुझे पास करने में सक्षम होना चाहिए (स्विफ्ट lenguage यह है), जो पंक्ति उपयोगकर्ता क्लिक के आधार पर कुछ जानकारीTableView से DetailView स्विफ्ट

हम एक RootViewController (तालिका देखें) है और एक DetailViewController enter image description here

(हमारे विचार)

(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 वर्ग

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

सवाल यह है कि (सेल के साथ एक xib फ़ाइल है):

यदि उपयोगकर्ता फेरारी 458 क्लिक करें, DetailViewController में lblDetail आएगा: फेरारी 458 एक सुपर है कार जो 325 किमी/घंटा तक पहुंचने में सक्षम है ...... (जो कुछ भी हम चाहते हैं) और imgDetail कार की एक छवि (जो भी हम चाहते हैं) दिखाने में सक्षम होगी

यदि उपयोगकर्ता अब बुगाटी वेरॉन पर क्लिक करते हैं तो lb lDetail हमें दिखाएं: बुगाटी वेरॉन एक आदर्श और सुपर स्पोर्ट मशीन है। यह दुनिया में सबसे तेजी से कार में से एक है ....

imgDetail हमें इस कार की एक छवि दिखाने

सभी कारों के आधार जो पंक्ति हम

क्लिक किया है मुझे पता है के साथ भी यही बात काम के आसपास है पहले देखें नियंत्रक में forSegue func लेकिन मैं इसे संभव बनाने के कई अलग-अलग तरीकों की कोशिश कर रहा था और कुछ भी ठीक चल रहा है

हम यह कैसे कर सकते हैं ???

+0

मुझे भी एक ही समस्या का सामना करना पड़ा जब मैं किसी अन्य दृश्य नियंत्रक को स्ट्रिंग को भविष्य के लिए अपने नाम से स्टोर करने की कोशिश कर रहा था। मैं इस लेख पर ठोकर खाई जो स्पष्ट रूप से इसे समझाता है। http://www.codingexplorer.com/segue-swift-view-controllers/ – Mechanic

उत्तर

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

लेकिन यह न भूलें अपने DetailViewController में एक passedValue चर बनाने के लिए।

यह एक दृश्य नियंत्रक से दूसरे डेटा को पास करने का एक उदाहरण है और आप इस उदाहरण के साथ डेटा को पास कर सकते हैं जैसा आपको चाहिए।

और अधिक जानकारी के लिए इस लिंक को देखें।

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

हाय धर्मेश चेनी, दयालुता के लिए सभी thx के पहले निश्चित रूप से आपने लिखा है कि यह मुझे थोड़ा और समझने में मदद करता है, लेकिन अभी भी नहीं करता है जिस तरह से मैं की तलाश कर रहा हूं, अब ऐप जानता है कि कौन सी पंक्ति का चयन किया गया था, लेकिन फिर मुझे यह जानने की जरूरत है कि lblDetail और imgDetail एस – FactorJose

+0

क्षमा करें ... किसी भी तरह मुझे लगता है कि हमें किसी कथन की आवश्यकता है या ऐसा कुछ ... लेकिन कहाँ? और कैसे? = एस मैं शुरुआत कर रहा हूं, मेरी माफी स्वीकार करें – FactorJose

+0

बस वैरिएबल व्यू कंट्रोलर में चर बनायें जो मूल्यों को पकड़ सकता है जब मान सेग्यू से पास हो जाते हैं और उस मान को उस चर को असाइन करते हैं और उसके बाद आप विवरण को VisualViewController में दिखा सकते हैं। –

0

इसका सरल, द्वारा जोड़ा जा रहा एक बयान। विवरण दृश्य लेबल में चयनित कार नाम पाने के लिए,

lblDetail.text = passedValue

आप अपने विस्तृत दृश्य का समारोह() viewDidLoad में रेखा के इस कोड को जोड़ सकते हैं। पासव्यू में कार का नाम होता है जिसे उपयोगकर्ता चुना जाता है (readyForSegue में असाइन करें) तो आप अपने विस्तृत दृश्य लेबल को असाइन कर सकते हैं।

उम्मीद है कि यह मदद करता है !!

0

आप अपने अगले दृश्य नियंत्रक करने के लिए प्रोटोटाइप सेल से एक segue खींचें (इंटरफ़ेस बिल्डर में) और उसके 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() की आवश्यकता नहीं है, न ही यह तालिका दृश्य विधि।

PushedViewController.swift में (अगले दृश्य नियंत्रक):

var valueToPass: String! 

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

यह लेबल के मूल्य स्थापित करने के लिए महत्वपूर्ण है के बाद यह स्टोरीबोर्ड से प्रारंभ। इसका मतलब है, आप लेबल को पिछले व्यू कंट्रोलर के prepareForSegue() में सीधे सेट नहीं कर सकते हैं, इसलिए इसे valueToPass से पास करने की आवश्यकता है।