tableView didSelectRowAt, didDeselectRowAt의 IndexPath 정보
소개
움직임을 모르는 초보자의 게시입니다.
당연하잖아! 라는 내용이므로 부드럽게 부탁드립니다.
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는 항상 선택한 행이라고 착각했기 때문입니다.
라고 할까, ,, 영어 읽으면 쓰고 있는 잖아. .
이상.
교제해 주셔서 감사합니다.
Reference
이 문제에 관하여(tableView didSelectRowAt, didDeselectRowAt의 IndexPath 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Miya49_p0/items/002f298ef655136d87d9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
아래 그림과 같은 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는 항상 선택한 행이라고 착각했기 때문입니다.
라고 할까, ,, 영어 읽으면 쓰고 있는 잖아. .
이상.
교제해 주셔서 감사합니다.
Reference
이 문제에 관하여(tableView didSelectRowAt, didDeselectRowAt의 IndexPath 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Miya49_p0/items/002f298ef655136d87d9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 ▲▲▲▲▲▲▲▲")
}
}
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 ▲▲▲▲▲▲▲▲")
}
didSelectRowAt = 선택한 셀 정보
didDeselectRowAt = 선택한 셀 정보
IndexPath는 항상 선택한 행이라고 착각했기 때문입니다.
라고 할까, ,, 영어 읽으면 쓰고 있는 잖아. .
이상.
교제해 주셔서 감사합니다.
Reference
이 문제에 관하여(tableView didSelectRowAt, didDeselectRowAt의 IndexPath 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Miya49_p0/items/002f298ef655136d87d9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)