2015-04-29 10 views
5

Sto costruendo un'app in Swift che fa molto affidamento su Table Views. Utilizza sia le intestazioni che i piè di pagina, oltre alla cancellazione delle righe. Per qualche strana ragione quando eseguo l'eliminazione di una riga, l'intestazione e il piè di pagina seguono il movimento di scorrimento della riga da eliminare. Gli screenshot qui sotto spiegano cosa intendo.Perché le intestazioni e i piè di pagina seguono il movimento della riga quando lo si elimina?

enter image description here

Come si fa a evitare questo?

sto implementando la funzione di eliminazione come questa:

// Deleting 
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    if editingStyle == .Delete { 

     // Handling data source updating, cell row deletion, transition... 

    } 
} 

E l'intestazione e piè di pagina in questo modo:

// ## Header ## 
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let headerCell = tableView.dequeueReusableCellWithIdentifier("shoppingHeader") as! ShoppingTableViewHeaderCell 

    // Clear up startup background 
    headerCell.textLabel?.backgroundColor = UIColor.clearColor() 

    // Add covering background color 
    headerCell.backgroundColor = UIColorFromHex(0x22b8a3, alpha: 1) 

    // Set store image, or store title if image is unavailable 
    let url = NSURL(string: dataSource[sortedStores[section]]["meta_data"]["logo"].string!) 
    let data = NSData(contentsOfURL: url!) 
    if data != nil { // Store image 
     let image = UIImage(data: data!) 
     headerCell.imageView?.image = imageResize(image: image!, cellWidth: 90, cellHeight: 30) 
    } else { // Store name label 
     headerCell.textLabel?.text = dataSource[sortedStores[section]]["meta_data"]["nameStore"].string 
     headerCell.textLabel?.font = UIFont(name: "HelveticaNeue-Light", size: 16) 
     headerCell.textLabel?.textColor = UIColor.whiteColor() 
    } 

    // Right hand side details: define strings 
    let address = dataSource[sortedStores[section]]["meta_data"]["street"].string 
    let distanceMeasure = dataSource[sortedStores[section]]["meta_data"]["distance"].int! 
    let numberOfOffers = dataSource[sortedStores[section]]["offers"].count 

    // Right hand side details: assign strings to variables 
    headerCell.rightLabel0.text = address 
    headerCell.rightLabel1.text = "\(distanceMeasure) m away" 
    if numberOfOffers == 1 { 
     headerCell.rightLabel2.text = "1 offer available" 
    } else { 
     headerCell.rightLabel2.text = "\(numberOfOffers) offers available" 
    } 

    // Right hand side details: set text color 
    headerCell.rightLabel0.textColor = UIColor.whiteColor() 
    headerCell.rightLabel1.textColor = UIColor.whiteColor() 
    headerCell.rightLabel2.textColor = UIColor.whiteColor() 

    return headerCell 
} 


// ## Footer ## 
override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { 
    let footerCell = tableView.dequeueReusableCellWithIdentifier("shoppingFooter") as! UITableViewCell 

    // Set black color to show that footer moves too. 
    footerCell.backgroundColor = UIColor.blackColor() //clearColor() 

    return footerCell 
} 
+0

come si creano le intestazioni e un piè di pagina? –

+0

@VladimirKravchenko Sto aggiungendo il codice come da protocollo. Penso ... Ho aggiornato la domanda, per includere questo codice. –

risposta

4

Penso che utilizzando cellule riutilizzabili per le intestazioni e piè di pagina è il tuo problema. Prova invece a usare i pennini. Creare un file .xib separato per le celle di intestazione e piè di pagina. E ottenere il vostro cellulare con:

let headerCell = NSBundle.mainBundle().loadNibNamed("YourNibName", owner: self, options: nil).first as! ShoppingTableViewHeaderCell 

o implementare sottoclasse di un UITableViewHeaderFooterView, creare un pennino per esso, registrare questo pennino con:

tableView .registerNib(UINib(nibName:"YourNibName", bundle: nil), forHeaderFooterViewReuseIdentifier: "TableHeader") 

e ottenere vista del vostro intestazione con:

let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier("TableHeader") 
+0

Questo non dovrebbe essere un problema. – Sulthan

+0

Qual è il mio file pennino in questo contesto? Non ho usato pennini prima, tutto quello che so è che è qualcosa di importante legato alla grafica della mia interfaccia. –

+1

Bene, l'utilizzo dei pennini non è necessario, ma almeno 'dequeueReusableHeaderFooterViewWithIdentifier' invece di' dequeueReusableCellWithIdentifier' sarebbe probabilmente preferito. – Sulthan

6

Restituisci semplicemente headerCell.contentView anziché headerCell e il tuo problema verrà risolto.

+0

Funziona! Grazie –

+0

Bello !!! Grazie. – realmasse

+0

ma l'evento click non funziona quando si utilizza questo trucco Qualsiasi ulteriore aiuto per quello –

Problemi correlati