Swift: passa l’etichetta UITableViewCell al nuovo ViewController

Ho un UITableView che popola celle con dati basati su una chiamata JSON. così:

var items = ["Loading..."] var indexValue = 0 // Here is SwiftyJSON code // for (index, item) in enumerate(json) { var indvItem = json[index]["Brand"]["Name"].stringValue self.items.insert(indvItem, atIndex: indexValue) indexValue++ } self.tableView.reloadData() 

Come ottengo l’etichetta della cella quando viene selezionata e poi la passo ad un altro ViewController?

Sono riuscito a ottenere:

 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!; println(currentCell.textLabel.text) } 

Non riesco a capire come passare questo come una variabile al prossimo UIViewController.

Grazie

Il passaggio dei dati tra due controller di visualizzazione dipende dal modo in cui i controller di vista sono collegati tra loro. Se sono collegati a seguito, sarà necessario utilizzare il metodo performSegueWithIdentifier e sostituire il metodo prepareForSegue

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

Se il tuo controller di visualizzazione non è collegato a seguito, puoi passare i valori direttamente dalla tua funzione tableView

 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!; let storyboard = UIStoryboard(name: "YourStoryBoardFileName", bundle: nil) var viewController = storyboard.instantiateViewControllerWithIdentifier("viewControllerIdentifer") as AnotherViewController viewController.passedValue = currentCell.textLabel.text self.presentViewController(viewContoller, animated: true , completion: nil) } 

Hai chiesto:

Come ottengo l’etichetta della cella quando viene selezionata e poi la passo ad un altro ViewController?

Potrei suggerire di riformulare la domanda nel modo seguente: “Come recuperare i dati associati alla cella selezionata e trasferirli a un altro controller di visualizzazione?”

Potrebbe sembrare la stessa cosa, ma qui c’è un’importante distinzione concettuale. Davvero non vuoi recuperare il valore dall’etichetta della cella. Le nostre app utilizzano un paradigma MVC , quindi quando si desidera passare le informazioni sui dati da una scena all’altra, si desidera tornare al modello (la matrice degli items ), non alla vista (la proprietà di text di UILabel ).

Questo è un esempio banale, quindi questa distinzione è un po ‘accademica, ma poiché le app diventano più complicate, questo modello di tornare al modello diventa sempre più importante. La rappresentazione della stringa dalla cella è generalmente un sostituto scadente per gli oggetti del modello reale. E, come vedrai più avanti, è altrettanto facile (se non più semplice) recuperare i dati dal modello, quindi dovresti farlo.

Per didSelectRowAtIndexPath , in questo caso non hai davvero bisogno di un metodo didSelectRowAtIndexPath . Tutto ciò che serve è un passaggio dalla cella di visualizzazione tabella alla scena di destinazione, dare a quel seguito un identificatore univoco ( Details nel mio esempio), e quindi implementare la prepare(for:sender:) :

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let destination = segue.destination as? DetailsViewController { let selectedRow = tableView.indexPathForSelectedRow!.row destination.selectedValue = items[selectedRow] } } 

In alternativa, se il tuo passaggio è tra la cella e la scena di destinazione, puoi anche utilizzare il sender della prepare(for:sender:) :

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let destination = segue.destination as? DetailsViewController { let cell = sender as! UITableViewCell let selectedRow = tableView.indexPath(for: cell)!.row destination.selectedValue = items[selectedRow] } } 

Ma l’idea è la stessa. Identificare quale riga è stata selezionata e recuperare le informazioni dal modello, la matrice di items .

Quanto sopra è Swift 3. Per Swift 2.3, vedere la versione precedente di questa risposta.

Okay. Sono stato 2 giorni che stavo cercando la risposta che come potevo essere in grado di salvare i dati del testo dell’etichetta UITableViewCell selezionati e visualizzare quei dati su un’altra etichetta su un altro controller di vista che uscirà dopo aver toccato una cella. Finalmente ho completato con il compito e il suo successo. Ecco il codice completo con i passaggi usando Swift. Sto usando Xcode 6.4.

Passo 1.

Ho assegnato due classi ai controller della vista storyboard denominati “iOSTableViewControllerClass.swift”, che è un controller di visualizzazione tabella e “iOSTutorialsViewControllerClass.swift”, che è un normale controller di visualizzazione.

Passo 2.

Ora esegui i passaggi da iOSTableViewControllerClass a iOSTutorialsViewControllerClass passando Control nell’area di storyboard e scegli “show” dal menu a discesa. Fare clic su questo pulsante evidenziato in base all’immagine sottostante ed eseguire il seguito.

Crea Segue selezionando questa icona e trascina il controllo sull'altra vista Controller

Passaggio 3.

Ora seleziona il seguito facendo clic sullo storyboard e assegnagli un identificatore nell’Inspector degli attributi. In questo caso l’ho chiamato “iOSTutorials”

Seleziona Segue nello storyboard e assegna un nome

Passaggio 4.

Ora in questa fase metti un’etichetta sulla tua cella e sull’altra unità di controllo della vista e crea prese di distribuzione sulle loro classi corrispondenti. Nel mio caso quelli sono “@IBOutlet weak var iOSCellLbl: UILabel!” e “@IBOutlet weak var iOSTutsClassLbl: UILabel!”.

Passaggio 5.

Creare una variabile di tipo stringa sulla prima class di controller vista tabella. Ho fatto questo come “var sendSelectedData = NSString ()” anche Make una variabile di tipo stringa sulla seconda class. Ho fatto questo come “var SecondArray: String!”.

Passaggio 6.

Ora siamo pronti per partire. Ecco il codice completo per la prima class –

  // iOSTableViewControllerClass.swift import UIKit class iOSTableViewControllerClass: UITableViewController, UITableViewDataSource,UITableViewDelegate { // Creating A variable to save the text from the selected label and send it to the next view controller var sendSelectedData = NSString() //This is the outlet of the label but in my case I am using a fully customized cell so it is actually declared on a different class @IBOutlet weak var iOSCellLbl: UILabel! //Array for data to display on the Table View var iOSTableData = ["Label", "Button", "Text Field", "Slider", "Switch"]; override func viewDidLoad() { super.viewDidLoad() //Setting the delegate and datasource of the table view tableView.delegate = self tableView.dataSource = self //Registering the class here tableView.registerClass(CustomTableViewCellClassiOS.self, forCellReuseIdentifier: "CellIDiOS") //If your using a custom designed Cell then use this commented line to register the nib. //tableView.registerNib(UINib(nibName: "CellForiOS", bundle: nil), forCellReuseIdentifier: "CellIDiOS") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { // Return the number of sections. return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // Return the number of rows in the section. return iOSTableData.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let CellIDentifier = "CellIDiOS" //In this case I have custom designed cells so here "CustomTableViewCellClassiOS" is the class name of the cell var cell:CustomTableViewCellClassiOS! = tableView.dequeueReusableCellWithIdentifier(CellIDentifier, forIndexPath: indexPath) as? CustomTableViewCellClassiOS if cell == nil{ tableView.registerNib(UINib(nibName: "CellForiOS", bundle: nil), forCellReuseIdentifier: CellIDentifier) cell = tableView.dequeueReusableCellWithIdentifier(CellIDentifier) as? CustomTableViewCellClassiOS } //Here we are displaying the data to the cell label cell.iOSCellLbl?.text = iOSTableData[indexPath.row] return cell } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { println("You selected cell #\(indexPath.row)!") // Get Cell Label text here and storing it to the variable let indexPathVal: NSIndexPath = tableView.indexPathForSelectedRow()! println("\(indexPathVal)") let currentCell = tableView.cellForRowAtIndexPath(indexPathVal) as! CustomTableViewCellClassiOS!; println("\(currentCell)") println("\(currentCell.iOSCellLbl?.text!)") //Storing the data to a string from the selected cell sendSelectedData = currentCell.iOSCellLbl.text! println(sendSelectedData) //Now here I am performing the segue action after cell selection to the other view controller by using the segue Identifier Name self.performSegueWithIdentifier("iOSTutorials", sender: self) } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { //Here i am checking the Segue and Saving the data to an array on the next view Controller also sending it to the next view COntroller if segue.identifier == "iOSTutorials"{ //Creating an object of the second View controller let controller = segue.destinationViewController as! iOSTutorialsViewControllerClass //Sending the data here controller.SecondArray = sendSelectedData as! String } 

Ecco il codice completo per la seconda class ..–

 // iOSTutorialsViewControllerClass.swift import UIKit class iOSTutorialsViewControllerClass: UIViewController { //Creating the Outlet for the Second Label on the Second View Controller Class @IBOutlet weak var iOSTutsClassLbl: UILabel! //Creating an array which will get the value from the first Table View Controller Class var SecondArray:String! override func viewDidLoad() { super.viewDidLoad() //Simply giving the value of the array to the newly created label's text on the second view controller iOSTutsClassLbl.text = SecondArray } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

Lo faccio così.

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedName = nameArray[indexPath.row] let newView: nextViewName = self.storyboard?.instantiateViewController(withIdentifier: "nextViewName") as! nextViewName newView.label.text = selectedValue self.present(newView, animated: true, completion: nil) }