2010-05-14 6 views
0

두 가지 주요 용도로 사용되는 탐색 기반 iPhone 전용 앱에서 작업 중입니다. 하나는 계층 적보기로 데이터를 표시하고 사용자가 드릴 다운하여 결국에는 데이터를 편집 할 수있게하고, 테이블보기 셀을 두드리면 모든 사용자가 기본 작업을 수행 할 수 있습니다. 이제는 동일한 데이터에 묶여있는 작은 옵션 세트를 제공해야합니다. 그러나 didSelectRowAtIndexPath : 및 accessoryButtonTappedForRowAtIndexPath : 메서드가 모두 사용됩니다.UITouch 이벤트 및 테이블보기

그래서, 내 옵션은 두 번 탭 방법을 구현하는 것 같습니다. 추가 옵션의 작은 목록은 테이블 행의 두 번 누르기 (추측) 후에 표시됩니다. 또는 바람직하게는 탭 앤 홀드 (tap-and-hold) 방법을 사용하여 수행 될 수있다. 내가 말할 수있는 것부터, 탭 앤드 홀드 (tap-and-hold)는 SDK 4.0에 들어가는 방법처럼 보입니다. 더블 탭 옵션을 사용하기로 결정했지만 조금 문제가 있습니다.

맨 먼저 touchesBegan : withEvent : 메소드가 전혀 호출되지 않은 것처럼 보입니다. ,

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *aTouch = [touches anyObject]; 
    if (aTouch.tapCount == 2) { 
     [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    } 
} 

둘째 : (이 기본 동작을 수행한다,라고하는 것입니다) 메소드 내에 배치 중단 점은 응용 프로그램이 실행되는 동안 호출되지 않습니다 및 테이블 뷰 내가 방법을 삽입하기 전에했던대로 정확하게 응답 단일 탭을 처리 할 필요가 없습니다. didSelectRowAtIndexPath : 메서드는 단일 탭을 올바르게 처리 할 수 ​​있습니다. 더블 탭은 내가 다루고 싶은 펑키 한 것입니다. 그 대답은 "테이블보기로는 싱글 탭을 처리 할 수없고 touchesBegan : 메서드는 더블 탭을 처리 할 수 ​​없습니다. 터치 처리 방법은 모두 처리해야합니다."라는 문구가 포함될 것으로 생각됩니다.

이 문제를 해결해 주신 여러분 께 도움이 될만한 정보를 보내 주시면 감사하겠습니다. 미리 감사드립니다.

답변

2

좋아, 1 주일 만에 머리를 긁어 내고 궁지에 몰린 후 마침내 다음과 같은 결론을 내 렸습니다. 이론적으로는 iPhone OS의 최신 버전을 사용하는 것이 가능하지만, 그것이 작동하도록 만드는 것은 규모면에서 헤라클레스가 될 것입니다. 가까운 장래에 iPhone OS 4가 어떻게 출시 될지보고, 4.0 SDK 기능을 사용하여 내가 원하는 동작을 구현하도록 선택했습니다.

특히, 내가 무슨 짓을하는 것은 이것이다 :

// in my tableView:cellForRowAtIndexPath: method 
static NSString *CellIdentifier = @"CustomCell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
[[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil]; 
    cell = tvCell; 
    self.tvCell = nil; 
} 
UILabel *label; 
label = (UILabel*)[cell viewWithTag:1]; 
label.text = [NSString stringWithFormat:@"Main Label"]; 
label = (UILabel*)[cell viewWithTag:2]; 
label.text = [NSString stringWithFormat:@"Sub Label"]; 
UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
[[cell viewWithTag:0] addGestureRecognizer:recognizer]; 
[recognizer release]; 
UIImage *theImage = [UIImage imageNamed:@"silhouette.png"]; 
UIImageView *pictureView = (UIImageView*)[cell viewWithTag:0]; 
pictureView.image = theImage; 
return cell; 

내가 정의 셀에 대해 별도의 NIB 파일을 만든; 맨 왼쪽에 imageView (연락처 사진의 경우)와 가운데에 두 개의 레이블 (큰 텍스트의 기본 레이블과 작은 텍스트의 하위 레이블)이있는 tableViewCell 객체 일뿐입니다. cellForRowAtIndexPath : 메서드는 필요에 따라이 사용자 정의 셀을로드 한 다음 셀에 일부 정적 데이터를 채 웁니다.이 코드는 기존 코드에 통합 할 때 분명히 변경됩니다.

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
NSLog(@"Long press detected."); 
} 

물론,이 역시 내가 실제로 사용하는 넣을 때 구체화 될 것이다 : 나는 단지 제스처 인식에 대한 하나의 새로운 방법을 구현했다.

전체 계약은 매력처럼 작동합니다. 셀을 길게 누르고 있으면 "Long press detected"로그가 표시되고 일반 단일 탭은 tableView : didSelectRowAtIndexPath : 메소드에서 비슷한 "Short press detected"로그를 실행합니다.

희망이 있으면 누군가에게 도움이됩니다.

관련 문제