J'ai un UITableView qui remplit les cellules avec des données basées sur un appel JSON. ainsi:
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()
Comment obtenir l'étiquette de la cellule quand elle est sélectionnée et ensuite la transmettre à un autre ViewController?
J'ai réussi à obtenir:
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)
}
Je n'arrive pas à comprendre comment passer cela comme variable au prochain UIViewController.
Merci
Le transfert de données entre deux contrôleurs de vue dépend de la façon dont les contrôleurs de vue sont liés. S'ils sont liés à segue, vous devrez utiliser la méthode performSegueWithIdentifier et remplacer la méthode 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
}
}
Si votre contrôleur de vue n'est pas lié à segue, vous pouvez passer des valeurs directement à partir de votre fonction 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)
}
Tu as demandé:
Comment puis-je obtenir l'étiquette de la cellule lorsqu'elle est sélectionnée, puis la transmettre également à un autre ViewController?
Je pourrais suggérer de reformuler la question comme suit: "Comment récupérer les données associées à la cellule sélectionnée et les transmettre à un autre contrôleur de vue?"
Cela peut sembler la même chose, mais il existe une distinction conceptuelle importante. Vous ne voulez vraiment pas récupérer la valeur de l'étiquette de la cellule. Nos applications utilisent un paradigme MVC . Ainsi, lorsque vous souhaitez transmettre des informations de données d’une scène à une autre, vous souhaitez revenir au modèle (le tableau items
), et non à la vue (la propriété text
du UILabel
).
Ceci est un exemple trivial, donc cette distinction est un peu académique, mais à mesure que les applications se compliquent, le retour au modèle devient de plus en plus important. La représentation sous forme de chaîne à partir de la cellule correspond généralement mal aux objets de modèle réels. Et, comme vous le verrez ci-dessous, il est tout aussi facile (sinon plus facile) de récupérer les données du modèle. Vous devriez donc simplement le faire.
En passant, vous n'avez pas vraiment besoin d'une méthode didSelectRowAtIndexPath
du tout dans ce cas. Tout ce dont vous avez besoin est une transition de la cellule de la vue table vers la scène de destination, attribuez à cette séquence un identificateur unique (Details
dans mon exemple), puis implémentez 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]
}
}
Si vous opérez entre la cellule et la scène de destination, vous pouvez également utiliser la variable sender
de la 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]
}
}
Mais l'idée est la même. Identifiez la ligne sélectionnée et récupérez les informations du modèle, le tableau items
.
Ce qui précède est Swift 3. Pour Swift 2.3, veuillez consulter la version précédente de cette réponse.
Ok. Cela faisait 2 jours que je cherchais la réponse: comment pourrais-je sauvegarder les données textuelles de l'étiquette UITableViewCell sélectionnées et les afficher sur une autre étiquette sur un autre contrôleur de vue qui sortira après avoir tapé sur une cellule. Enfin, j'ai terminé avec la tâche et son succès. Voici le code complet avec les étapes utilisant Swift. J'utilise Xcode 6.4.
Étape 1.
J'ai deux classes assignées aux contrôleurs de vue de storyboard nommées "iOSTableViewControllerClass.Swift" qui est un contrôleur de vue de table et "iOSTutorialsViewControllerClass.Swift" qui est un contrôleur de vue normal.
Étape 2.
Faites maintenant la transition entre iOSTableViewControllerClass et iOSTutorialsViewControllerClass en tout en maintenant la touche Ctrl enfoncée, en faisant glisser la souris sur la zone du scénarimage et en choisissant "Afficher" dans le menu déroulant. Cliquez sur ce bouton en surbrillance selon l'image ci-dessous et effectuez la transition.
Étape 3.
Sélectionnez maintenant la séquence en cliquant sur le scénario et attribuez-lui un identifiant dans l'inspecteur d'attributs. Dans ce cas, je l'ai nommé "iOSTutorials"
Étape 4.
Maintenant, à cette étape, mettez une étiquette sur votre cellule ainsi que sur l’autre contrôleur de vue et créez-leur des sorties sur leurs classes correspondantes . Dans mon cas, il s'agit de "@IBOutlet faible var iOSCellLbl: UILabel!" et "@IBOutlet faible var iOSTutsClassLbl: UILabel!".
Étape 5.
Créez une variable de type chaîne sur la première classe de contrôleur de vue de table. J'ai fait ceci en tant que "var sendSelectedData = NSString ()" Créez également une variable de type chaîne sur la deuxième classe. Je l'ai fait comme "var SecondArray: String!".
Étape 6.
Maintenant nous sommes prêts à partir. Voici le code complet pour la première classe -
// 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
}
Voici le code complet pour la deuxième classe ..--
// 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.
}
}
Je le fais comme ça.
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)
}