0

UITabBar이있는 응용 프로그램이 있습니다. 모든 탭은 UINavigationController이며 내부에 여러 개의 UIViewControllers이 있습니다. 뷰 컨트롤러 중 하나에는 UITableView이 포함되어 있으며 길게 눌린 UITableViewCell을 삭제하기위한 플로팅 메뉴를 표시하려고합니다.UITableViewCell이 첫 번째 응답자가되지 않습니다 (셀 제스처에 UIMenuController 표시)

나는 UIMenuController을 사용하고 있지만 셀이 첫 번째 응답을 거부하기 때문에 표시되지 않습니다. 있는 UITableViewCell 내가 오버라이드 (override) 한 방법에

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
     lpgr.minimumPressDuration = 1.0; //second 
     [table addGestureRecognizer:lpgr]; 

     [lpgr release]; 
    } 

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
     CGPoint p = [gestureRecognizer locationInView: table]; 

     NSIndexPath *indexPath = [table indexPathForRowAtPoint:p]; 
     if (indexPath != nil) { 
      UITableViewCell* cell = [self tableView:table cellForRowAtIndexPath: indexPath]; 

      [cell becomeFirstResponder]; 
      UIMenuItem *delete = [[UIMenuItem alloc] initWithTitle:@"Delete" action:@selector(delete:)]; 

      UIMenuController *menu = [UIMenuController sharedMenuController]; 
      [menu setMenuItems:[NSArray arrayWithObjects:delete, nil]]; 
      [menu setTargetRect:cell.frame inView:cell.superview]; 
      [menu setMenuVisible:YES animated:YES]; 
     } 
    } 
} 

: 셀이 첫 번째로 반응이되고되지 않는 이유에

-(BOOL) canBecomeFirstResponder { 
    return YES; 
} 

어떤 아이디어

여기 내 코드입니까?

감사합니다.

+0

을 할 수 첫 번째 응답자가되어야하는 이유를 말해 주시겠습니까? 어쨌든 첫 번째 응답자는 셀 위에 추가되는 메뉴 여야합니다! – imthi

+0

@imthi 메뉴를 표시하려면 먼저 응답해야합니다. 어쨌든 내 문제는 메뉴가 표시되지 않는다는 것입니다. 그 사람이 첫 번째 응답자와 관련이 있다고 생각했습니다. – momo

답변

1

는 내가 코드를 고정 생각

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
     CGPoint p = [gestureRecognizer locationInView: self.tableView]; 
     NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p]; 
     if (indexPath != nil) { 

      [self becomeFirstResponder]; 
      UIMenuItem *delete = [[UIMenuItem alloc] initWithTitle:@"Delete" action:@selector(customDelete:)]; 

      UIMenuController *menu = [UIMenuController sharedMenuController]; 
      [menu setMenuItems:[NSArray arrayWithObjects:delete, nil]]; 
      [menu setTargetRect:[self.tableView rectForRowAtIndexPath:indexPath] inView:self.tableView]; 
      [menu setMenuVisible:YES animated:YES]; 
     } 
    } 
} 

- (void)customDelete:(id)sender { 
// 
} 

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if (action == @selector(customDelete:)){ 
     return YES; 
    } 
    return NO; 
} 

:-) 나는 한 다음 ..

  1. [자기 becomeFirstResponder];
  2. [메뉴 setTargetRect : [self.tableView rectForRowAtIndexPath : indexPath] inView : self.tableView]; 이 기능을 구현 한 경우
  3. 은 대부분 필요하지 canPerformAction에 대한 사실이 추가

좋은 읽기 :-) 해당 지역의 참조 변수에있는 tableview와 다른 것들 변경하십시오 - 당신을 http://www.intridea.com/blog/2010/12/22/developers-notes-for-uimenucontroller

+0

감사합니다. ;-) – momo