④TableView  ViewController 土台

④TableView  ViewController
土台

<h3><Font color="red">
Xcode version 7.3.1 </Font>And <Font color="blue">Xcode 8 GM seed</Font>
</h3>

![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/2ade61e1-6a50-a290-a9e7-0c5e62fbb561.png)

![002.png](https://qiita-image-store.s3.amazonaws.com/0/93155/145764d9-ccca-03f3-ae0f-4d5103b8bd33.png)

![003.png](https://qiita-image-store.s3.amazonaws.com/0/93155/368482da-5902-2ff2-1331-5d9ab7db54a6.png)


```swift:ViewController.swift
class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource ,NonHeaderCallBack{

 
    @IBOutlet weak var nonTableView: UITableView!
    
    var checkAllStatusItems: [Bool] = [false,false,false];
 
    private let nonHeaderSection: NSArray = ["HEADER 1", "HEADER 2", "HEADER 3"]
    private let nonCategorySection: NSArray = ["Category 1","Category 2","Category 3"]
    private let nonFukuokaItems: NSArray = ["Fukuoka 1", "Fukuoka 2", "Fukuoka 3", "Fukuoka 4", "Fukuoka 5", "Fukuoka 6", "Fukuoka 7", "Fukuoka 8", "Fukuoka 9"]
    private let nonKumamotoItems: NSArray = ["Kumamoto 1", "Kumamoto 2", "Kumamoto 3", "Kumamoto 4", "Kumamoto 5", "Kumamoto 6", "Kumamoto 7"]
    private let nonKagoshimaItems: NSArray = ["Nagasaki 1","Nagasaki 2","Nagasaki 3","Nagasaki 4","Nagasaki 5","Nagasaki 6","Nagasaki 7","Nagasaki 8"]
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
      
        //カスタムセルを設定する
        let nib = UINib(nibName: "nonCustomTableViewCell", bundle: nil)
        nonTableView.registerNib(nib, forCellReuseIdentifier: "nonCell")
        nonTableView.scrollEnabled = true
        nonTableView.layer.borderColor = UIColor.blueColor().CGColor
        nonTableView.layer.borderWidth = 1;
        
        let headerNib = UINib(nibName: "nonHeaderTableCell", bundle: nil)
        nonTableView.registerNib(headerNib, forCellReuseIdentifier: "nonHeaderCell")
        
        let categoryNib = UINib(nibName: "nonCategoryTableCell", bundle: nil)
        nonTableView.registerNib(categoryNib, forCellReuseIdentifier: "nonCategoryCell")
        
        //デリゲート
        nonTableView.dataSource = self
        nonTableView.delegate = self
        self.view.addSubview(nonTableView)
        
    }
    
    /*
     選択しちゃうエリアのボタンを押した時のイベント　チェックON、OFF画像の差し替え
     */
    func didchckAllTap(sender: AnyObject){
        let button :UIButton = sender as! UIButton
        checkAllStatusItems[button.tag] = !checkAllStatusItems[button.tag]
        print("[button.tag:\(button.tag)")
        print("[checkAllStatusItems[button.tag]:\(checkAllStatusItems[button.tag])")
        //再表示
        self.nonTableView.reloadData()
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    /*
     セクションの数を返す.
     */
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return nonHeaderSection.count
    }
    
    
    /*
     セクションのタイトルを返す.
     */
    func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        
        let header = tableView.dequeueReusableCellWithIdentifier("nonHeaderCell") as!
        nonHeaderTableCell
        header.delegate = self
        
        header.allCheckImageVIew.image = getImageView(checkAllStatusItems[section])
        header.allButton.tag = section
        header.nonHeaderLabel.text = nonHeaderSection[section] as? String
        
        return header
    }
    
    func getImageView(target: Bool) ->UIImage {
        return (target ? UIImage(named: "image_check_on.png") : UIImage(named: "image_check_off.png"))!
    }
    
    
    /*
     テーブルに表示する配列の総数を返す.
     */
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            return nonFukuokaItems.count + 1
        } else if section == 1 {
            return nonKumamotoItems.count + 1
        } else if section == 2 {
            return nonKagoshimaItems.count + 1
        } else {
            return 0
        }
    }
    
    /*
     Cellに値を設定する.
     */
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // <Cellのカスタムクラス名> という記述を追加
        let cell = tableView.dequeueReusableCellWithIdentifier("nonCell") as? nonCustomTableViewCell
        let categoryCell = tableView.dequeueReusableCellWithIdentifier("nonCategoryCell") as? nonCategoryTableCell
        
        switch indexPath.section {
        case 0:
            //print("[indexPath.row:\(indexPath.row)")
            if(indexPath.row == 0){
                categoryCell?.nonCategoryLabel.text = "\(nonCategorySection[0])"
                return categoryCell!
            }else{
                cell?.nonLabel.text = "\(nonFukuokaItems[indexPath.row - 1])"
                return cell!
            }
        case 1:
            //print("[indexPath.row:\(indexPath.row)")
            if(indexPath.row == 0){
                categoryCell?.nonCategoryLabel.text = "\(nonCategorySection[1])"
                return categoryCell!
            }else{
                cell?.nonLabel.text = "\(nonKumamotoItems[indexPath.row - 1])"
                return cell!
            }

        case 2:
            //print("[indexPath.row:\(indexPath.row)")
            if(indexPath.row == 0){
                categoryCell?.nonCategoryLabel.text = "\(nonCategorySection[2])"
                return categoryCell!
            }else{
                cell?.nonLabel.text = "\(nonKagoshimaItems[indexPath.row - 1])"
                return cell!
            }
        default:
            return cell!
        }        
        
    }
    
    /*
     Cell が選択された時
     */
    func tableView(table: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
        print("[indexPath.row:\(indexPath.row)")
        
    }

    
}

```


```swift:nonHeaderTableCell.swift
import UIKit

protocol NonHeaderCallBack : class {
    func didchckAllTap(sender: AnyObject)
}

class nonHeaderTableCell: UITableViewCell {

    weak var delegate: NonHeaderCallBack! = nil
    
    @IBOutlet weak var nonHeaderLabel: UILabel!

    @IBOutlet weak var allButton: UIButton!
    
    @IBOutlet weak var allCheckImageVIew: UIImageView!
    
    @IBAction func onClickAllButton(sender: AnyObject) {
        
        self.delegate?.didchckAllTap(sender)
    }
}

```

<Font color="blue">Xcode 8 GM seed</Font>
⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource ,NonHeaderCallBack{

 
    @IBOutlet weak var nonTableView: UITableView!
    
    var checkAllStatusItems: [Bool] = [false,false,false];
 
    fileprivate let nonHeaderSection: NSArray = ["HEADER 1", "HEADER 2", "HEADER 3"]
    fileprivate let nonCategorySection: NSArray = ["Category 1","Category 2","Category 3"]
    fileprivate let nonFukuokaItems: NSArray = ["Fukuoka 1", "Fukuoka 2", "Fukuoka 3", "Fukuoka 4", "Fukuoka 5", "Fukuoka 6", "Fukuoka 7", "Fukuoka 8", "Fukuoka 9"]
    fileprivate let nonKumamotoItems: NSArray = ["Kumamoto 1", "Kumamoto 2", "Kumamoto 3", "Kumamoto 4", "Kumamoto 5", "Kumamoto 6", "Kumamoto 7"]
    fileprivate let nonKagoshimaItems: NSArray = ["Nagasaki 1","Nagasaki 2","Nagasaki 3","Nagasaki 4","Nagasaki 5","Nagasaki 6","Nagasaki 7","Nagasaki 8"]
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
      
        //カスタムセルを設定する
        let nib = UINib(nibName: "nonCustomTableViewCell", bundle: nil)
        nonTableView.register(nib, forCellReuseIdentifier: "nonCell")
        nonTableView.isScrollEnabled = true
        nonTableView.layer.borderColor = UIColor.blue.cgColor
        nonTableView.layer.borderWidth = 1;
        
        let headerNib = UINib(nibName: "nonHeaderTableCell", bundle: nil)
        nonTableView.register(headerNib, forCellReuseIdentifier: "nonHeaderCell")
        
        let categoryNib = UINib(nibName: "nonCategoryTableCell", bundle: nil)
        nonTableView.register(categoryNib, forCellReuseIdentifier: "nonCategoryCell")
        
        //デリゲート
        nonTableView.dataSource = self
        nonTableView.delegate = self
        self.view.addSubview(nonTableView)
        
    }
    
    /*
     選択しちゃうエリアのボタンを押した時のイベント　チェックON、OFF画像の差し替え
     */
    func didchckAllTap(_ sender: AnyObject){
        let button :UIButton = sender as! UIButton
        checkAllStatusItems[button.tag] = !checkAllStatusItems[button.tag]
        print("[button.tag:\(button.tag)")
        print("[checkAllStatusItems[button.tag]:\(checkAllStatusItems[button.tag])")
        //再表示
        self.nonTableView.reloadData()
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    /*
     セクションの数を返す.
     */
    func numberOfSections(in tableView: UITableView) -> Int {
        return nonHeaderSection.count
    }
    
    
    /*
     セクションのタイトルを返す.
     */
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        
        let header = tableView.dequeueReusableCell(withIdentifier: "nonHeaderCell") as!
        nonHeaderTableCell
        header.delegate = self
        
        header.allCheckImageVIew.image = getImageView(checkAllStatusItems[section])
        header.allButton.tag = section
        header.nonHeaderLabel.text = nonHeaderSection[section] as? String
        
        return header
    }
    
    func getImageView(_ target: Bool) ->UIImage {
        return (target ? UIImage(named: "image_check_on.png") : UIImage(named: "image_check_off.png"))!
    }
    
    
    /*
     テーブルに表示する配列の総数を返す.
     */
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            return nonFukuokaItems.count + 1
        } else if section == 1 {
            return nonKumamotoItems.count + 1
        } else if section == 2 {
            return nonKagoshimaItems.count + 1
        } else {
            return 0
        }
    }
    
    /*
     Cellに値を設定する.
     */
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // <Cellのカスタムクラス名> という記述を追加
        let cell = tableView.dequeueReusableCell(withIdentifier: "nonCell") as? nonCustomTableViewCell
        let categoryCell = tableView.dequeueReusableCell(withIdentifier: "nonCategoryCell") as? nonCategoryTableCell
        
        switch (indexPath as NSIndexPath).section {
        case 0:
            //print("[indexPath.row:\(indexPath.row)")
            if((indexPath as NSIndexPath).row == 0){
                categoryCell?.nonCategoryLabel.text = "\(nonCategorySection[0])"
                return categoryCell!
            }else{
                cell?.nonLabel.text = "\(nonFukuokaItems[(indexPath as NSIndexPath).row - 1])"
                return cell!
            }
        case 1:
            //print("[indexPath.row:\(indexPath.row)")
            if((indexPath as NSIndexPath).row == 0){
                categoryCell?.nonCategoryLabel.text = "\(nonCategorySection[1])"
                return categoryCell!
            }else{
                cell?.nonLabel.text = "\(nonKumamotoItems[(indexPath as NSIndexPath).row - 1])"
                return cell!
            }

        case 2:
            //print("[indexPath.row:\(indexPath.row)")
            if((indexPath as NSIndexPath).row == 0){
                categoryCell?.nonCategoryLabel.text = "\(nonCategorySection[2])"
                return categoryCell!
            }else{
                cell?.nonLabel.text = "\(nonKagoshimaItems[(indexPath as NSIndexPath).row - 1])"
                return cell!
            }
        default:
            return cell!
        }        
        
    }
    
    /*
     Cell が選択された時
     */
    func tableView(_ table: UITableView, didSelectRowAt indexPath:IndexPath) {
        print("[indexPath.row:\((indexPath as NSIndexPath).row)")
        
    }
```



```swift:nonHeaderTableCell.swift
import UIKit

protocol NonHeaderCallBack : class {
    func didchckAllTap(_ sender: AnyObject)
}

class nonHeaderTableCell: UITableViewCell {

    weak var delegate: NonHeaderCallBack! = nil
    
    @IBOutlet weak var nonHeaderLabel: UILabel!

    @IBOutlet weak var allButton: UIButton!
    
    @IBOutlet weak var allCheckImageVIew: UIImageView!
    
    @IBAction func onClickAllButton(_ sender: AnyObject) {
        
        self.delegate?.didchckAllTap(sender)
    }
}
```