2017-07-04 1 views
0

J'ai un comportement assez étrange lors de la mise à jour d'une cellule TableViews.IOS Swift: l'animation des modifications TableviewCell ne fonctionne pas correctement

La meilleure façon de décrire est une vidéo: https://drive.google.com/open?id=0B67InGf2FEPaODFLUEhLZ29LWTg

Ici vous pouvez voir que la première fois que j'essaie de développer (ou réduire) la vue, il sor de fait quelque chose, mais pas vraiment. Les vues que je voulais montrer ne sont pas là, mais ça scintille.

Voici mon code:

class StylingTableViewController: UITableViewController { 

//MARK: properties 
var articles = [Article]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    articles.append(contentsOf: [Article(id: "Artikel 1"), Article(id: "Artikel 2")]) 

    //Let table auto layout in height 
    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 100 

    // Use the edit button item provided by the table view controller. 
    navigationItem.rightBarButtonItem = editButtonItem 
} 

// MARK: - Table view data source 
override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    // Table view cells are reused and should be dequeued using a cell identifier. 
    let cellIdentifier = "ArticleDetailCell" 

    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? StylingDetailTableViewCell else { 
     fatalError("The dequeued cell is not an instance of StylingDetailTableViewCell.") 
    } 

    let article = articles[indexPath.row] 
    cell.articleName.text = article.id 

    //Scrollview 
    let width:CGFloat = 90; 
    var xPos:CGFloat = 0; 
    var scrollViewContentSize:CGFloat=0; 
    for _ in 0...10{ 
     let myView:CFPictureView = CFPictureView() 
     myView.frame.size.width = 80 
     myView.frame.size.height = 120 
     myView.frame.origin.x = CGFloat(xPos) 
     xPos += width 
     cell.pictures_scrollView.addSubview(myView) 
     scrollViewContentSize += width 
     cell.pictures_scrollView.contentSize = CGSize(width: scrollViewContentSize, height: 120) 
    } 

    return cell 
} 

// Override to support editing the table view. 
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 
     // Delete the row from the data source 
     articles.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: .fade) 
    } else if editingStyle == .insert { 
     // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
    } 
} 

//MARK: Actions 
@IBAction func favButtonPressed(_ sender: UIButton) { 
    sender.isSelected = !sender.isSelected 
} 
@IBAction func expandCell(_ sender: UIButton) { 

    if let cell = sender.superview?.superview?.superview?.superview?.superview as? StylingDetailTableViewCell { 
     cell.fieldDescriptorStackView.isHidden = false; 
     cell.articleBarcode.isHidden = false; 
     cell.articleCustomerNumber.isHidden = false; 
     cell.articleStyle.isHidden = false; 
     cell.expandCellButton.isHidden = true; 
     cell.collapseCellButton.isHidden = false; 
     cell.pictures_order.isHidden = false; 
     cell.pictures_amount.isHidden = false; 
     cell.pictures_scrollView.isHidden = false; 
     cell.pictures_title.isHidden = false; 

     let indexPath = tableView.indexPath(for: cell) 
     self.tableView.reloadRows(at: [indexPath!], with: UITableViewRowAnimation.automatic) 
     (self.parent as? StylingViewController)?.topStackView.isHidden = true; 
    } 

} 
@IBAction func collapseCell(_ sender: UIButton) { 

    if let cell = sender.superview?.superview?.superview as? StylingDetailTableViewCell { 
     cell.fieldDescriptorStackView.isHidden = true; 
     cell.articleBarcode.isHidden = true; 
     cell.articleCustomerNumber.isHidden = true; 
     cell.articleStyle.isHidden = true; 
     cell.expandCellButton.isHidden = false; 
     cell.collapseCellButton.isHidden = true; 
     cell.pictures_order.isHidden = true; 
     cell.pictures_amount.isHidden = true; 
     cell.pictures_scrollView.isHidden = true; 
     cell.pictures_title.isHidden = true; 

     let indexPath = tableView.indexPath(for: cell) 
     self.tableView.reloadRows(at: [indexPath!], with: UITableViewRowAnimation.automatic) 
     (self.parent as? StylingViewController)?.topStackView.isHidden = false; 
    } 
} 
func undoAction() { 
    print("undo") 

} 

}

Il semble que quelque chose ne va pas avec tableView.reloadRows. Aide serait appréciée

Répondre

0

Pourrait être le problème parce que l'application ne connaissait toujours pas la hauteur estimée de la cellule à la première exécution. Un correctif pourrait être en ajoutant ceci sur viewDidLoad:

tableView.estimatedRowHeight = 60 
tableView.rowHeight = UITableViewAutomaticDimension 
+0

Merci pour votre réponse, mais j'avais déjà tableView.rowHeight = UITableViewAutomaticDimension et tableView.estimatedRowHeight = 100 dans mon viewDidLoad() – Tterhuelle

+0

Pourriez-vous partager votre fichier de classe? –

+0

J'ai ajouté le fichier de classe entière – Tterhuelle