2016-10-20 29 views
2

私のTableViewに問題があります。セクションフッタを追加した後、スワイプして削除すると、それが動くことがわかりました。スワイプで削除すると、TableViewスワイプのヘッダーとフッターのセクションも

私が直面している問題を示すために、この機能を持つ最小限のプロジェクトを作成しました。 これは私が2 TableViewCell持っBefore I swipe After swiping

を取得した結果である: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) 
} 

} 

と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) 
} 

} 

これは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] 
} 

} 

私は間違いを犯しましたか、ヘッダーとフッターを水平に「ブロック」する方法がありますか?

答えて

3

ヘッダーとフッターの種類をUITableViewHeaderFooterViewに変更し、.dequeueReusableHeaderFooterView(withIdentifier: "headerOrFooterCell")tableViewメソッドを使用します。ペン先を登録することを忘れないでください。私は以下のコードをテストし、あなたが書いていた問題なしで動作します。

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

これは正しいです。あなたはUITableViewCells(すなわちヘッダーとフッター)でないものにUITableViewCellのインスタンスを使用するはずではありません。そうしないと、このような奇妙な動作が起こります。私は、UITableViewCellヘッダーとフッターでアニメーションを削除して挿入するのと同じような経験をしました。 –

+0

私はこれをして、問題があります。今私は "NSException型の未知の例外で終了"エラーがあります。私は今、セルにコードを登録して、プロトタイプのCellを使用していて、IBで識別子を与えていたという事実とは関係があります。ヘッダーやフッターの表示に使用したプロトタイプは使用できません。 – FredericP

+0

私はそれを得た。私はセルのための別のxibを作成する必要があります。うまく働いた – FredericP

関連する問題