2011-01-12 7 views

답변

12

나는 LTKeyPressTableView과 비슷한 것을 구현했습니다. 그러나 배열 컨트롤러를 사용하므로 서브 클래스에 IBOutlet NSArrayController * relatedArrayController을 추가했습니다. Delegate에서 삭제 요청을 처리하는 대신, 하위 클래스가 Delete 키 처리를 추가적으로 다루기 때문에 하위 클래스에서 직접 삭제 요청을 처리합니다. 키를 삭제하기 위해 keypress를 감지하면, 나는 단지 [relatedArrayController delete:nil];으로 전화하고 있습니다.

#import "IRTableView.h" 


@implementation IRTableView 


- (void)keyDown:(NSEvent *)event 
{ 
    // Based on LTKeyPressTableView. 
    //https://github.com/jacobx/thoughtkit/blob/master/LTKeyPressTableView 

    id delegate = [self delegate]; 

    // (removed unused LTKeyPressTableView code) 

    unichar key = [[event charactersIgnoringModifiers] characterAtIndex:0]; 
    if(key == NSDeleteCharacter) 
    { 
     if([self selectedRow] == -1) 
     { 
      NSBeep(); 
     } 

     BOOL isEditing = ([[self.window firstResponder] isKindOfClass:[NSText class]] && 
          [[[self.window firstResponder] delegate] isKindOfClass:[IRTableView class]]); 
     if (!isEditing) 
     { 
      [relatedArrayController remove:nil]; 
      return; 
     } 

    } 

    // still here? 
    [super keyDown:event]; 
} 

@end 

최종 결과가 나에게 아주 IB 친화적이며, 코코아 바인딩 + 코어에서 사용하기에 아주 간단한 해결책 :

IRTableView.h :

#import <Cocoa/Cocoa.h> 

@interface IRTableView : NSTableView { 
    IBOutlet NSArrayController * relatedArrayController; 
} 

@end 

및 IRTableView.m 데이터 응용 프로그램.

26

일반적으로하는 일은 응용 프로그램의 메뉴 표시 줄에 새 메뉴 항목을 만드는 것입니다. 뭔가 같이 :

File -> Delete ${Name of Item}

그런 다음 앱 위임 또는 다른 컨트롤러 중 하나에 어딘가에 정의 된 IBAction를 방법을 가리 키도록 인터페이스 빌더에서 그 NSMenuItem를 연결할 수 있습니다. 이 메소드를 구현하면 모델에서 항목이 삭제되고 NSTableView을 새로 고쳐야합니다.

  1. 당신은 항목을 인터페이스 빌더에서 키보드 단축키를 제공 할 수 있습니다 :

    조치를 벗어난 NSMenuItem를 만들기의 장점은 것입니다. (삭제 키와 같습니다.)

  2. 애플리케이션에 익숙하지 않거나 삭제 키를 누르거나 키보드를 사용할 수없는 사용자는이 기능을 계속 사용할 수 있습니다.
+1

안녕하세요, Craig. 당신의 대답은 내가 정말로 기대했던 것이 아니지만 꽤 좋은 것처럼 들립니다! = D 대단히 감사합니다. – Leandro

+2

하하 음, 처음에는 꽤 간접적 인 접근 방법 인 것처럼 보이지만, 매우 잘 작동하며 많은 두통을 처리합니다. –

+0

두 테이블 뷰가 없다면 ... – peetonn

9

10.10 이후 NSViewController는 응답 체인의 일부입니다. 그래서 가장 쉬운 방법은 서브 클래 싱 된 NSViewController에 keyDown을 구현하는 것입니다.

+1

서브 클래스를 피하기 위해 응답 체인을 사용하는 것이 좋은 점입니다 (가능한 경우). –

4

keyDown을 서브 클래스 화하고 NSViewController에 잡을 필요가 없습니다.

메뉴 EditDelete 메뉴 항목이 First Responder의 선택자 delete:에 연결되어 있습니다. Delete 메뉴 항목이 없으면 하나 만들고이를 첫 번째 응답자 (빨간색 큐브)의 delete:에 연결하십시오.

  • IBAction 방법을 구현 뷰 컨트롤러에서 Delete 메뉴 항목 ( 또는 ⌘⌫)
  • 에 해당하는 키를 할당

    스위프트 : @IBAction func delete(_ sender: AnyObject)

    Objective- C : -(IBAction)delete:(id)sender

    을 입력하고 테이블 뷰 행을 삭제하는 로직을 입력하십시오.