2016-10-20 1 views
2

Ich habe ein Problem mit meinem TableView. Nach dem Hinzufügen einer Abschnittsfußzeile erkannte ich, dass es sich bewegt, wenn ich zum Löschen wische.Beim Wischen zum Löschen wischen der Kopf- und Fußzeilenbereich des TableViews auch

Ich habe ein minimales Projekt mit nur dieser Funktion erstellt, um das Problem zu zeigen, das ich gegenüberstelle. Dies ist das Ergebnis, das ich

Before I swipe After swiping

Ich habe zwei TableViewCell erhalten: DetailCell

import UIKit 

class DetailCell: UITableViewCell { 


@IBOutlet weak var myTextLabel: UILabel! 


override func awakeFromNib() { 
    super.awakeFromNib() 
} 

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
} 

} 

und HeaderFooterCell

import UIKit 

class HeaderFooterCell: UITableViewCell { 
@IBOutlet weak var thisTextLabel: UILabel! 

override func awakeFromNib() { 
    super.awakeFromNib() 
} 

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
} 

} 

Dies ist der Tableviewcontroller

import UIKit 

class TableViewController: UITableViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let statusBarHeight = UIApplication.shared.statusBarFrame.height 
    self.tableView.contentInset = UIEdgeInsetsMake(statusBarHeight, 0.0, 0.0, 0.0) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

// MARK: - Table view data source 

override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

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


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myTableViewCell", for: indexPath) as! DetailCell 
     switch indexPath.row { 
      case 0: cell.myTextLabel?.text = "one - one - one - one" 
      case 1: cell.myTextLabel?.text = "two - two - two - two" 
      case 2: cell.myTextLabel?.text = "three - three - three - three" 
      case 3: cell.myTextLabel?.text = "four - four - four - four" 
      case 4: cell.myTextLabel?.text = "five - five - five - five" 
      default: break 
     } 
     return cell 
} 

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 44 
} 
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "headerOrFooterCell") as! HeaderFooterCell 
    cell.thisTextLabel.text = "Less" 
    return cell 
} 

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { 
    return 44 
} 
override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "headerOrFooterCell") as! HeaderFooterCell 
    cell.thisTextLabel.text = "More" 
    return cell 
} 

// MARK: RowAction for DELETE and MODIFY 
override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let delete = UITableViewRowAction(style: .destructive, title: "Delete") { (action, indexPath) in 
     print ("Delete") 
    } 

    let modify = UITableViewRowAction(style: .normal, title: "Modify") { (action, indexPath) in 
     print("Modify") 
    } 

    return [delete, modify] 
} 

} 

Habe ich einen Fehler gemacht oder gibt es eine Möglichkeit, die Kopfzeile und die Fußzeile horizontal zu "blockieren"?

Antwort

3

Ändern Sie den Typ der Kopf- und Fußzeile in UITableViewHeaderFooterView, und verwenden Sie dann die TableView-Methode .dequeueReusableHeaderFooterView (withIdentifier: "headerOrFooterCell"). Vergiss nicht, Nibs zu registrieren. Ich habe den Code unten getestet und es funktioniert ohne Probleme, über die Sie geschrieben haben.

import UIKit 

class DetailCell: UITableViewCell { 
    @IBOutlet weak var myTextLabel: UILabel! 
    override func awakeFromNib() { 
    super.awakeFromNib() 
    } 
} 



class HeaderFooterCell: UITableViewHeaderFooterView { 
    @IBOutlet weak var thisTextLabel: UILabel! 

    override func awakeFromNib() { 
    super.awakeFromNib() 
    } 
} 


class TableViewController: UITableViewController { 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    let statusBarHeight = UIApplication.shared.statusBarFrame.height 
    self.tableView.contentInset = UIEdgeInsetsMake(statusBarHeight, 0.0, 0.0, 0.0) 

    self.tableView.register(UINib(nibName:"DetailCell", bundle: nil), forCellReuseIdentifier: "myTableViewCell") 
    self.tableView.register(UINib(nibName:"HeaderFooterCell", bundle: nil), forHeaderFooterViewReuseIdentifier: "headerOrFooterCell") 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    } 

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
    } 

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


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myTableViewCell", for: indexPath) as! DetailCell 
    switch indexPath.row { 
    case 0: cell.myTextLabel?.text = "one - one - one - one" 
    case 1: cell.myTextLabel?.text = "two - two - two - two" 
    case 2: cell.myTextLabel?.text = "three - three - three - three" 
    case 3: cell.myTextLabel?.text = "four - four - four - four" 
    case 4: cell.myTextLabel?.text = "five - five - five - five" 
    default: break 
    } 
    return cell 
    } 

    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 
    return 44 
    } 
    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 

    let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "headerOrFooterCell") as! HeaderFooterCell 

    cell.thisTextLabel.text = "Less" 
    return cell 
    } 

    override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { 
    return 44 
    } 
    override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { 
    let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: "headerOrFooterCell") as! HeaderFooterCell 
    cell.thisTextLabel.text = "More" 
    return cell 
    } 

    // MARK: RowAction for DELETE and MODIFY 
    override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 
    let delete = UITableViewRowAction(style: .destructive, title: "Delete") { (action, indexPath) in 
     print ("Delete") 
    } 

    let modify = UITableViewRowAction(style: .normal, title: "Modify") { (action, indexPath) in 
     print("Modify") 
    } 

    return [delete, modify] 
    } 

} 
+1

Dies ist korrekt. Sie sollten nicht die Instanz von UITableViewCell für Dinge verwenden, die nicht UITableViewCells sind (zB Kopf- und Fußzeilen), sonst bekommen Sie seltsames Verhalten wie dieses. Ich hatte eine ähnliche Erfahrung mit dem Löschen und Einfügen von Animationen mit UITableViewCell-Kopf- und Fußzeilen. –

+0

Ich habe das getan, und ich habe ein Problem. Jetzt habe ich einen Fehler "mit nicht abgefangener Ausnahme vom Typ NSException beenden". Ich bin ziemlich sicher, dass es etwas mit der Tatsache zu tun hat, dass ich jetzt die Zellen in Code registriere, und ich benutzte Prototyp-Zellen und gab eine Kennung in IB. Also kann ich den Prototyp, den ich für die Kopf- oder Fußzeile gemacht habe, nicht verwenden? – FredericP

+0

Ich habe es. Ich muss eine separate Xib für die Zellen erstellen. Hat gut funktioniert – FredericP

Verwandte Themen