2 votes

Comment partager les données d'un tableViewCell avec le viewController suivant sans utiliser le storyboard dans ios avec Swift ?

J'utilise des fichiers Xib dans mon projet pour construire l'interface de mon application. J'ai une tableView dans mon premier ViewController à partir duquel je veux passer des données au ViewController suivant. J'ai créé une cellule personnalisée pour mon tableView qui contient une imageView et deux étiquettes.

Voici mon code

import UIKit

class YASProductListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // registering my custom cell
    tableView.registerNib(UINib(nibName: "YASProductListTableViewCell", bundle: NSBundle.mainBundle()), forCellReuseIdentifier: "cell")
    let cell : YASProductListTableViewCell =  tableView.dequeueReusableCellWithIdentifier("cell") as! YASProductListTableViewCell
    cell.productNameLabel.text = prodcutNames[indexPath.row]
    cell.productDetailLabel.text = productDetail[indexPath.row]

    return cell
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return prodcutNames.count
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    return 140
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let cell = self.tableView.cellForRowAtIndexPath(indexPath) as! YASProductListTableViewCell

    let destination = YASProductDetaiilViewController(nibName: "YASProductDetaiilViewController", bundle: NSBundle.mainBundle())

    destination.productImage = cell.productImageView.image
    destination.productTitle = cell.productNameLabel.text!

    let productDetails = YASProductDetaiilViewController(nibName: "YASProductDetaiilViewController", bundle: nil) as YASProductDetaiilViewController
    navigationController?.navigationBarHidden = false
    navigationController?.title = ""
    navigationController?.pushViewController(productDetails, animated: true)

}

Maintenant, ce que je veux faire, c'est passer l'image et le texte de l'étiquette au viewController suivant lorsque l'utilisateur tape sur une cellule. Voici le code du contrôleur de vue suivant

import UIKit

class YASProductDetaiilViewController: UIViewController {
@IBOutlet weak var productImageView: UIImageView!
@IBOutlet weak var productTitleLabel: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    setupViewControllerUI()
    // Do any additional setup after loading the view.
}

// MARK: - UIViewController helper Methods

func setupViewControllerUI(){

    productImageView.image = productImage
    productTitleLabel.text = productTitle
}
}

Comme vous pouvez le voir, j'ai essayé didSelectRowAtIndexPath mais cela ne fonctionne pas. Merci de m'aider ! Merci de votre aide.

2voto

Umair Afzal Points 2428

Vous utilisez la bonne méthode pour partager des données entre viewController. Cependant, vous avez commis une erreur. Vous créez deux instances de votre ProductDetailViewController. Vous devez créer une seule instance du ViewCotroller de destination et définir ses propriétés en conséquence. Vous pouvez simplement remplacer votre méthode didSelectRowAtIndexPath par ce qui suit

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let cell = self.tableView.cellForRowAtIndexPath(indexPath) as! YASProductListTableViewCell
    let productDetails = YASProductDetaiilViewController(nibName: "YASProductDetaiilViewController", bundle: nil) as YASProductDetaiilViewController
    productDetails.productImage = cell.productImageView.image
    productDetails.productTitle = cell.productNameLabel.text!
    navigationController?.pushViewController(productDetails, animated: true)

}

J'espère que cela fonctionnera.

1voto

Jigar Tarsariya Points 2567

Modifiez votre méthode didSelect comme le code ci-dessous,

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

let cell = self.tableView.cellForRowAtIndexPath(indexPath) as! YASProductListTableViewCell

let productDetails = YASProductDetaiilViewController(nibName: "YASProductDetaiilViewController", bundle: nil) as YASProductDetaiilViewController
navigationController?.navigationBarHidden = false
navigationController?.title = ""
productDetails.productImage = cell.productImageView.image
productDetails.productTitle = cell.productNameLabel.text!
navigationController?.pushViewController(productDetails, animated: true)

}

J'espère que cela vous aidera.

0voto

Hitesh Surani Points 2175

La procédure suivante pourrait vous aider.

 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let cell = self.tableView.cellForRowAtIndexPath(indexPath) as! YASProductListTableViewCell
        let objYASProductDetaiilViewController = self.storyboard?.instantiateViewControllerWithIdentifier("STRORYBOARD_ID") as? YASProductDetaiilViewController     
        objYASProductDetaiilViewController.productImage = cell.productImageView.image
        objYASProductDetaiilViewController.productTitle = cell.productNameLabel.text!
        self.navigationController?.pushViewController(objMedicalDevicesVC!, animated: true)
        navigationController?.navigationBarHidden = false
        navigationController?.title = ""
        navigationController?.pushViewController(objYASProductDetaiilViewController, animated: true)

    }

Ici, vous ne pouvez pas attribuer un image View a image View Il faut d'abord récupérer une image, puis la donner à un autre contrôleur de vue, puis la définir en tant qu'image. UIImage

    import UIKit

    class YASProductDetaiilViewController: UIViewController {
    @IBOutlet weak var productImageView: UIImage!
    @IBOutlet weak var productTitleLabel: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        setupViewControllerUI()
        // Do any additional setup after loading the view.
    }

    // MARK: - UIViewController helper Methods

    func setupViewControllerUI(){

        productImageView.image = productImage
        productTitleLabel.text = productTitle
    }
    }

0voto

Amit Jagesha シ Points 832

créer un dictionnaire contenant toutes les informations nécessaires, les ajouter à un tableau et les obtenir en utilisant indexpath.row lorsque l'on clique sur une cellule

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

var dicTemp=prodcutNames[indexPath.row] as! NSMutableDictionary
let destination = YASProductDetaiilViewController(nibName: "YASProductDetaiilViewController", bundle: NSBundle.mainBundle())

destination.productImage = prodcutNames.valueForKey("imageObj") //get image object
destination.productTitle = prodcutNames.valueForKey("product_title")//get product title

let productDetails = YASProductDetaiilViewController(nibName: "YASProductDetaiilViewController", bundle: nil) as YASProductDetaiilViewController
navigationController?.navigationBarHidden = false
navigationController?.title = ""
navigationController?.pushViewController(productDetails, animated: true)

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X