tableView didSelectRowAt, didDeselectRowAt의 IndexPath 정보

14360 단어 Swift4Xcode9

소개



움직임을 모르는 초보자의 게시입니다.
당연하잖아! 라는 내용이므로 부드럽게 부탁드립니다.

didSelectRowAt보다 check를 붙여 그 indexPath.row를 배열에 격납



아래 그림과 같은 TableView를 만듭니다.



・이어서 기재한 코드
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITabBarDelegate{

    @IBOutlet weak var TableView: UITableView!   
    var checkflg = [Int]()

    //〜〜〜 省略 〜〜〜

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        print("▼▼▼▼▼▼▼▼ didSelectRowAt_process_bafore ▼▼▼▼▼▼▼▼")

        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = .checkmark
        checkflg.append(indexPath.row)

        print("indexPath = \(indexPath)")
        print("indexPath.row = \(indexPath.row)" )
        print("checkflg重複処理前 = \(checkflg) ")

        let orderedSet = NSOrderedSet(array: checkflg)
        checkflg = orderedSet.array as! [Int]

        print("checkflg重複処理後 = \(checkflg) ")
        print("▲▲▲▲▲▲▲▲ didSelectRowAt_process_after ▲▲▲▲▲▲▲▲")

    }
}

탭했지만 indexPath.row (무슨 줄?)을 checkflg 라는 배열에 저장해 가고 무엇이 check를 붙일 수 있었는지의 이력을 남기는 사양.
첫 번째 줄, 세 번째 줄, 두 번째 줄을 탭합니다 // checkflg = [0, 2, 1]처럼 된다.

이어서 let orderedSet = NSOrderedSet(array: checkflg) 에서 중복된 숫자(1행째를 2번 탭 등)의 제거
이것이 없으면 첫 번째 줄, 세 번째 줄, 두 번째 줄, 첫 번째 줄을 탭합니다.
가 되어 버리기 때문에 삭제하고 다시 // checkflg = [0, 2, 1, 0] 에 격납한다.

실제로 1행, 3행, 2행, 1행을 탭




checkflg이번 section으로 나누지 않았기 때문에 모두 0, rowIndex가 변화해 간다.indexPath[section, rowIndex] 에 제대로 탭한 행의 정보가 표시되고 있다.
또한 네 번째 디버그에서 [0, 2, 1, 0]의 배열이 [0, 2, 1]이되어 중복 처리도 가능하다.

그리고는 func 라고 부르는 didDeselectRowAt에서 탭 된 행 번호를 취득해
배열에 그 행 번호가 있는지 검색한 후 지우면, check 플래그를 사용해 체크가 잘 붙일 수 있는 것은! ? 라는 상태.

didDeselectRowAt 추가


class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITabBarDelegate{

    @IBOutlet weak var TableView: UITableView!   
    var checkflg = [Int]()

    //〜〜〜 省略 〜〜〜

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        //print("▼▼▼▼▼▼▼▼ didSelectRowAt_process_bafore ▼▼▼▼▼▼▼▼")

        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = .checkmark
        checkflg.append(indexPath.row)

        //print("indexPath = \(indexPath)")
        //print("indexPath.row = \(indexPath.row)" )
        //print("checkflg重複処理前 = \(checkflg) ")

        let orderedSet = NSOrderedSet(array: checkflg)
        checkflg = orderedSet.array as! [Int]

        //print("checkflg重複処理後 = \(checkflg) ")
        //print("▲▲▲▲▲▲▲▲ didSelectRowAt_process_after ▲▲▲▲▲▲▲▲")

     }

    //追加
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {

        print("▼▼▼▼▼▼▼▼ didDeselectRowAt_process_bafore ▼▼▼▼▼▼▼▼")
        print("checkflg検索&削除前 = \(checkflg) ")

        if let index = checkflg.index(of: indexPath.row){
            checkflg.remove(at: index)
        }

        print("checkflg検索&削除後 = \(checkflg) ")        
        print("▲▲▲▲▲▲▲▲ didDeselectRowAt_process_after ▲▲▲▲▲▲▲▲")

    }
}
indexPath.row에서 indexPath.row와 같은 번호가 배열에 존재하는지 검색합니다. 그렇다면if let index = checkflg.index(of: indexPath.row) 에서 삭제한다.

마찬가지로 1행, 3행, 2행, 1행을 탭





총 4회 했는데 3회밖에 로그가 흐르지 않았다.
게다가 배열의 내용이 비어있다! !

... didSelectRowAt의 로그 부활 & didDeselectRowAt에 로그 추가!
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {

        print("▼▼▼▼▼▼▼▼ didDeselectRowAt_process_bafore ▼▼▼▼▼▼▼▼")

        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = .none

        print("indexPath = \(indexPath)")
        print("indexPath.row = \(indexPath.row)" )
        print("checkflg検索前 = \(checkflg) ")

        if let index = checkflg.index(of: indexPath.row){
            checkflg.remove(at: index)
        }

        print("checkflg検索後 = \(checkflg) ")
        print("▲▲▲▲▲▲▲▲ didDeselectRowAt_process_after ▲▲▲▲▲▲▲▲")

    }

다시 1행, 3행, 2행, 1행을 탭





매우보기 어려운 디버깅하지 않습니다.

이렇게
didSelectRowAt가 처음 호출되고 나중에 탭할 때마다
didDeselectRowAt → didSelectRowAt라고합니다.


didDeselectRowAt는 탭되고 있던 셀의 정보를 읽어내, 또 불려 가는 타이밍으로서는 포커스가 벗어난 타이밍.

결과



didSelectRowAt = 선택한 셀 정보
didDeselectRowAt = 선택한 셀 정보

IndexPath는 항상 선택한 행이라고 착각했기 때문입니다.

라고 할까, ,, 영어 읽으면 쓰고 있는 잖아. .

이상.
교제해 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기