2014-06-10 1 views
16

UITableView가있는보기 컨트롤러가 있습니다. 테이블 뷰의 높이는 정적이며 == 화면의 높이입니다. 테이블의 행 수는 변경 될 수 있으며 행 수가 표시 가능한 행 수보다 적을 때 상황에 따라 테이블 하단에 일부 명확한 영역이 나타납니다. 제스처 인식기없이 탭을 감지 할 수 있습니까? UITableView의 일부 대리자 메서드가 있습니까? 탭이 기존 행에 발생하는 경우UITableView의 명확한 부분에 탭을 감지하는 방법?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

그러나, 이것은 단지 당신을 말할 것이다 :

+0

선택 사용 didSelectRowAtIndexPath에 , 또는 tapgesture도 사용할 수 있습니다. –

+0

@VictorIppolitov UITableView 하위 클래스를 생성하고이를 테이블 뷰에 할당하고 새 하위 클래스에서 touchesBegan을 재정의하는 방법은 무엇입니까? –

답변

37

예, 같은 위임 방법이있다. 행 아래의 빈 공간 (또는 섹션 머리글)에서 탭을 캡처하려면 제스처 인식기를 사용해야합니다.

// in viewDidLoad or somewhere similar 
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tableTapped:)]; 
[self.tableView addGestureRecognizer:tap]; 
//......... 

- (void)tableTapped:(UITapGestureRecognizer *)tap 
{ 
    CGPoint location = [tap locationInView:self.tableView]; 
    NSIndexPath *path = [self.tableView indexPathForRowAtPoint:location]; 

    if(path) 
    { 
     // tap was on existing row, so pass it to the delegate method 
     [self tableView:self.tableView didSelectRowAtIndexPath:path]; 
    } 
    else 
    { 
     // handle tap on empty space below existing rows however you want 
    } 
} 

편집 : 당신은 같은 것을 할 수있는 대체 접근 방식이 게시물에 그의 대답에서 Connor Neville's approach을 고려하고 테이블의 배경에 제스처 인식기를 추가합니다.

+0

대표자를 통해 제스처를 자동으로 잡아 내지 않는 영역에서 제스처를 잡고 싶으므로 제스처 인식기를 사용하는 것이 쉽지 않습니다. – Stonz2

+0

이제 cant 핸들 이벤트 "tableTapped". UIGestureRecognizerDelegate를 추가했지만 작동하지 않습니다. –

+0

@VictorIppolitov 변수 이름을'self.tableView'에서 인스턴스/클래스 변수 이름이 테이블에 맞게 변경해야 할 수도 있습니다. – Stonz2

-4

제스처 인식기가 필요하지 않습니다. 당신은 당신의 ViewController.h<UITableViewDelegate>을 impliment 다음 ViewController.m에이 방법을 추가해야합니다 : indexPath 클릭 행/열 인덱스

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

. @ Stonz2, 신속한 버전으로

+1

이것은 기존 행 아래의 빈 공간에있는'tableView'의 탭에 대한 정보를 제공하지 않습니다. 이것은 asker가 요구하는 것입니다. – Stonz2

14

감사 :

스위프트 4

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) 
self.tableView.addGestureRecognizer(tap) 

@objc func tableTapped(tap:UITapGestureRecognizer) { 
    let location = tap.location(in: self.tableView) 
    let path = self.tableView.indexPathForRow(at: location) 
    if let indexPathForRow = path { 
     self.tableView(self.tableView, didSelectRowAt: indexPathForRow) 
    } else { 
     // handle tap on empty space below existing rows however you want 
    } 
} 

스위프트 3

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) 
self.tableView.addGestureRecognizer(tap) 

func tableTapped(tap:UITapGestureRecognizer) { 
    let location = tap.location(in: self.tableView) 
    let path = self.tableView.indexPathForRow(at: location) 
    if let indexPathForRow = path { 
     self.tableView(self.tableView, didSelectRowAt: indexPathForRow) 
    } else { 
     // handle tap on empty space below existing rows however you want 
    } 
} 

스위프트 2 :

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) 
self.tableView.addGestureRecognizer(tap) 


func tableTapped(tap:UITapGestureRecognizer) { 
    let location = tap.locationInView(self.tableView) 
    let path = self.tableView.indexPathForRowAtPoint(location) 
    if let indexPathForRow = path { 
     self.tableView(self.tableView, didSelectRowAtIndexPath: indexPathForRow) 
    } else { 
     // handle tap on empty space below existing rows however you want 
    } 
} 
22

허용 된 대답을 비롯하여 제공된 모든 대답은 에 UITapGestureRecognizer을 추가합니다. 이 동작하는 동안, 나는이 제스처 인식기가 다소 예측할 수없는/비 결정적인 방식으로 행 탭 및 트리거 didSelectRowAtIndexPath을 방해 할 수 있음을 발견했습니다.

는 "빈 공간"뿐만 아니라 행에 탭을 검색하도록하려면, 내가보기 엔 테이블에 배경보기를 추가 제안, 거기 제스처 인식기를 추가

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped)) 
self.tableView.backgroundView = UIView() 
self.tableView.backgroundView?.addGestureRecognizer(tap) 
+5

** 이것은 가장 좋은 답변입니다 ** :'tableView' 선택 응답을 유지하므로 행 선택도 볼 수 있습니다. –

+0

공유해 주셔서 감사합니다. –

관련 문제