2010-07-11 38 views
15

Tôi đã thiết lập một UITapGestureRecognizer trên viewDidLoad của bộ điều khiển xem của tôi nhưng bằng cách nào đó nó kích hoạt phương thức chọn hai lần cho một lần chạm.UIGestureRecognizer kích hoạt hai lần?

UITapGestureRecognizer *g = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openInMapsApp:)] autorelease]; 
[self.mapView addGestureRecognizer:g]; 

phương pháp của tôi:

-(void)openInMapsApp:(UIGestureRecognizer*)g { 
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" 
                message:@"This will open this location in the Maps application. Continue?" 
                delegate:self 
              cancelButtonTitle:@"Cancel" 
              otherButtonTitles:@"OK",nil]; 
[alertView show]; 
[alertView release]; 
} 
+0

Có thể điều này sẽ xảy ra chỉ trong một thời gian? –

Trả lời

2

Tôi đã thêm một bộ đếm thời gian để quan điểm cho rằng kiểm tra để chắc chắn rằng các liên lạc ít nhất là nửa giây trước và bỏ qua các liên lạc thứ hai nếu nó là quá sớm.

Đây chỉ là giải pháp thay thế. Tôi vẫn muốn sửa chữa vấn đề thực sự.

4

Tôi có thể xác nhận tương tự. Tôi đã gửi một báo cáo lỗi cho Apple với một dự án mẫu trình bày vấn đề.

Giải pháp tạm thời mà tôi tìm thấy là tắt UITapGestureRecognizer ngay lập tức trước khi hiển thị Cảnh báo. Sau đó, trong phương thức đại diện UIAlertView bạn thực hiện, kích hoạt lại nó. Điều này đòi hỏi bạn phải theo dõi GR bằng cách nào đó, nhưng nó có vẻ như là giải pháp thanh lịch nhất cho thời gian.

Sử dụng mẫu mã trên:

-(void)openInMapsApp:(UIGestureRecognizer*)g { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" 
               message:@"This will open this location in the Maps application. Continue?" 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"OK",nil]; 
    g.enabled = NO; 
    self.activeGestureRecognizer = g; 
    [alertView show]; 
    [alertView release]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    self.activeGestureRecognizer.enabled = YES; 
    self.activeGestureRecognizer = nil; 
} 

- (void)alertViewCancel:(UIAlertView *)alertView { 
    self.activeGestureRecognizer.enabled = YES; 
    self.activeGestureRecognizer = nil; 
} 
+0

Giải pháp này cũng phù hợp với tôi. Đây có phải là một lỗi không? – mvexel

+0

Tôi có cùng một vấn đề với một trang tính hành động. Cách giải quyết này đã sửa nó. Cảm ơn! –

+2

Lỗi này phải được giải quyết như iOS SDK 4.2. Tôi đã có thể xác nhận độ phân giải của Apple. – gorbster

4

tôi đã cùng một vấn đề, và tôi nhận thấy sự kiện thứ hai có tình trạng UIGestureRecognizerStateCancelled (trong khi người đầu tiên đã UIGestureRecognizerStateEnded), vì vậy cách giải quyết khác là bỏ qua sự kiện này trong trường hợp.

-1

Tôi đã làm điều này và làm việc:

đầu tiên khởi tạo thành viên trên đối tượng xử lý của bạn mà các cửa hàng swipe cuối cùng NSTimeInterval

-(id)initWithResourcePath:(NSString*)path { 

    if ([super init]) { 
     //some code 


     lastSwipe = 0; 
    } 
    return self; 

} 

Sau đó thêm mã này vào phương pháp của bạn

-(void)viewDetectedRightSwipe:(UISwipeGestureRecognizer*)recognizer { 


//touch being registered  
NSTimeInterval thisTouch = [NSDate timeIntervalSinceReferenceDate]; 

//if the last swipe is the first swipe, then there's nothing to do but the handling of a correct gesture 
if(lastSwipe !=0) { 
    // find out how much time has passed between gestures 
    NSTimeInterval timeSinceLastTouch = thisTouch -lastSwipe ; 

    NSLog(@"thisTouch = %f",thisTouch); 
    NSLog(@"timeSinceLastTouch = %f",timeSinceLastTouch); 
    if (timeSinceLastTouch<0.2f) { 
     //return if this is an invalid touch 
     return; 
    } else { 
     // register the timestamp if it is valid 
     lastSwipe = thisTouch; 
     NSLog(@"left"); 
    } 

} 
// invalid gestures won't be registed because they won't get to this portion of code. 
lastSwipe = thisTouch; 
NSLog(@"left"); 
// rest of the handling code 
} 
19

Gesture người nhận dạng gửi hành động với trạng thái cử chỉ khác nhau. Vì vậy, nó không phải là một lỗi. Cách giải quyết là:

UITapGestureRecognizer *g = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openInMapsApp:)] autorelease]; 
[self.mapView addGestureRecognizer:g]; 

-(void)openInMapsApp:(UIGestureRecognizer*)g { 
if(g.state != UIGestureRecognizerStateRecognized) 
    return; 
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"" 
                message:@"This will open this location in the Maps application. Continue?" 
                delegate:self 
              cancelButtonTitle:@"Cancel" 
              otherButtonTitles:@"OK",nil]; 
[alertView show]; 
[alertView release]; 
} 
5

Tôi đã có một đôi UIAlertView đi lên. Như được thể hiện bởi Nicolas Rostov ở trên, điều này làm việc cho tôi. Cả hai trạng thái UIGestureRecognizerStateEnded và trạng thái UIGestureRecognizerStateRecognized đều đã tạo chế độ xem cảnh báo mới khi [alertView show] được sử dụng trong khối. Với // [alertView show] đã nhận xét, cả hai vẫn hiển thị trên bảng điều khiển, nhưng chỉ có một hành động diễn ra.

-(void) handleTapGesture:(UIGestureRecognizer*)sender{ 
    if(sender.state != UIGestureRecognizerStateRecognized) 
    return; 
1
if(g.state != UIGestureRecognizerStateBegan) 
//instead of if(g.state != UIGestureRecognizerStateRecognized) 
return; 

này sẽ gọi alertview ngay lập tức sau sự kiện cử chỉ. ví dụ: nếu bạn sử dụng sự kiện longtap, cảnh báo sẽ hiển thị khi bạn tắt ngón tay. Nhưng trạng thái UIGestureRecognizerStateBegan sẽ được gọi tự động nếu cử chỉ được nhận tự động.

3

Tôi vừa giải quyết một vấn đề tương tự. Nó bật ra rằng tôi đã có hai công cụ nhận dạng cử chỉ được thêm vào chế độ xem với cùng một cuộc gọi. Cách tôi phát hiện ra là NSLogging bộ nhận dạng cử chỉ khi bộ chọn đang được gọi.

Ở vị trí của bạn, tôi sẽ kiểm tra để đảm bảo rằng bạn không có hai trình nhận dạng cử chỉ - một từ bảng phân cảnh và một ví dụ khác được tạo theo chương trình chẳng hạn.

NSLog(@"recognizer: %@",[gestureRecognizer description]); 
+0

mẹo hay. tnxx – user1105951

Các vấn đề liên quan