32179


UITableViewでチェックリストを作ってみたのですが、現在Cellを押すとチェックリストのUIImageが変更されます。Cellを押すと別のUITableViewに移動でき、UIImageを押下時にのみ画像が変更されるようにするにするにはどうすればいいでしょうか？

[code]

    import UIKit
    
    class ViewController : UIViewController, UITableViewDelegate, UITableViewDataSource {
    
        let statusBarHeight = UIApplication.shared.statusBarFrame.height
    
        var checkListItem: [String : Bool] = [
            "アイテム1" : false,
            "アイテム2" : false,
        ]
    
        let tableView = UITableView()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // UITableView の作成
            tableView.frame = CGRect(
                x: 0,
                y: statusBarHeight,
                width: self.view.frame.width,
                height: self.view.frame.height - statusBarHeight
            )
            tableView.delegate = self
            tableView.dataSource = self
            self.view.addSubview(tableView)
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
            var keys = [String](checkListItem.keys)
    
            keys.sort()
    
            let cellText = keys[indexPath.row]
    
            let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
            cell.textLabel?.text = cellText
    
            if self.checkListItem[cellText]! {
                cell.imageView?.image = UIImage(named: "checked")
            } else {
                cell.imageView?.image = UIImage(named: "unchecked")
            }
    
            return cell
        }
    
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
            if let cell = tableView.cellForRow(at: indexPath) {
    
                let cellText = cell.textLabel?.text
    
                if cell.imageView?.image == UIImage(named: "checked") {
    
                    self.checkListItem.updateValue(false, forKey: cellText!)
                    cell.imageView?.image = UIImage(named: "unchecked")
                } else {
    
                    self.checkListItem.updateValue(true, forKey: cellText!)
                    cell.imageView?.image = UIImage(named: "checked")
                }
    
                cell.isSelected = false
            }
        }
    
        func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            return 56
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return self.checkListItem.count
        }
    }
    
[/code]


CC BY-SA 3.0
2017-01-26T12:33:58.800
32172
2017-01-28T00:53:38.163
2017-01-28T00:53:38.163
20406
20406
question
swift xcode
UITableViewでチェックリストを作成する


二種類の解決法があると思います。ひとつは、カスタムのセル（`UITableViewCell`のサブクラス）を作り、イメージを`UIButton`としてセルに貼り付け、タップしたら自身の`image`を変更するアクションをつけることです。すこし大きなプログラムになります。  
もうひとつは、方針を若干変更して、Appleの「[ヒューマンインターフェイスガイドライン](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/index.html)」に従ったものにすることです。

[![画像の説明をここに入力](https://i.stack.imgur.com/05AXv.png)](https://i.stack.imgur.com/05AXv.png)

スクリーンショットのように、DetailButton（`UITableViewCellAccessoryType.detailButton`）をセルに表示します。  
`UITableViewDelegate`メソッドを、コードに追加します。画面遷移の種類は、モーダル表示、遷移先のView
Controllerを`ModalViewController`とします。

[code]

    func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) {
        let controller = ModalViewController(nibName: nil, bundle: nil)
        present(controller, animated: true, completion: nil)
    }
    
[/code]

セルをタップしたら、イメージが変更することは変わりませんが、Detailボタンをタップすると、モーダルに遷移するようになります。方針と異なりますが、できることは同じです。


CC BY-SA 3.0
2017-01-27T01:33:26.240
32179
2017-01-27T01:33:26.240
18540
32172
answer