문제

사용자가 행을 두 번 클릭 할 때 창을 열려면 응용 프로그램이 필요합니다. NSTableView. 나는 이것을 달성하는 방법에 대한 정보 나 예제를 찾는 데 약간의 어려운 시간을 보내고 있습니다. 아무도 나를 올바른 방향으로 가리킬 수 있습니까?

도움이 되었습니까?

해결책

살펴보십시오 -setDoubleAction: nstableView의 메소드; 일반 대상 행동 시스템과 마찬가지로이를 두 번 클릭 할 수있는 메소드로 설정할 수 있습니다.

그 행동 방법에서 -clickedRow 유용 할 것입니다.

다른 팁

Cocoa에 다른 신규 이민자의 이익을 위해 @jimpuls 답변에 더 기본 정보를 추가합니다.

  1. NstableView에 대한 iBoutlet은 인터페이스에서 선언해야합니다. 나는 테이블의 대의원에서 그렇게하는 것이 선호된다고 생각했다.
  2. 테이블의 iBoutlet은 인터페이스 빌더를 통해 연결해야합니다. 이를 수행하려면 CTRL-DRAG & IB가 출구를 테이블 뷰로 선언하는 클래스에서 IB를 떨어 뜨립니다. 마우스를 풀면 1 단계에서 선언 한 배출구의 이름으로 팝업이 나타납니다. 그것을 선택하십시오.
  3. @implementation 섹션에서 -awakefromnib 메소드에서 -settarget : and -setdoubleAction : 1 단계에서 선언 된 iBoutlet에서 2 단계에서 연결됩니다.

다음은 내 테이블 뷰 대의원에서 발췌 한 내용입니다. 대의원도 DataSource로 설정되어 있으므로 NstableViewDelegate 및 NstabeviewDatasource 인터페이스가 모두 관련되어 있습니다.

// 인터페이스 발췌.

@interface MyTableViewDelegate : NSObject <NSTableViewDelegate, NSTableViewDataSource>
{
  // This iVar needs to be connected to the table view via the IB.
  IBOutlet NSTableView *tableOutlet;
}

@property (assign) IBOutlet NSTableView *tableOutlet;

- (void)doubleClick:(id)nid;

@end

// 구현 발췌.

@implementation MyTableViewDelegate

@synthesize tableOutlet = _tableOutlet;

- (void)awakeFromNib {
  [_tableOutlet setTarget:self];
  [_tableOutlet setDoubleAction:@selector(doubleClick:)];
}

- (void)doubleClick:(id)object {
  // This gets called after following steps 1-3.
  NSInteger rowNumber = [_tableOutlet clickedRow];
  // Do something...
}

도움이 되었기를 바랍니다.

PR Singh가 말했듯이 코코아 바인딩을 사용할 수 있으며 선택된 도체를 따라 전달할 수도 있습니다.

  1. IB에서 테이블보기를 선택한 다음 바인딩 에서이 두 바인딩을 다음과 같이 설정하십시오.

    >Double Click Target
    
    bind to = Application delegate object (or file owner)
    model key path = self
    selector name = myMethod:
    
    >Double Click Argument
    
    bind to = array controller
    controller key = selectedObjects
    selector name = myMethod:
    

MyMethod가 구현되는 곳

- (void)myMethod:(NSArray*)selectedObjects
{
    NSLog(@"%@", selectedObjects);
}

여기에도 문서화되어 있습니다.https://developer.apple.com/library/mac/qa/qa1472/_index.html

누군가가 Swift 2.0 버전을 찾는다면 : 이것이 저에게 효과적입니다. 목표 C 코드보다 훨씬 쉬운 것 같습니다.

@IBOutlet weak var searchResultTable: NSTableView!

override func viewDidLoad() {
    super.viewDidLoad()
    searchResultTable.doubleAction = "doubleClickOnResultRow"
}

func doubleClickOnResultRow()
{
    print("doubleClickOnResultRow \(searchResultTable.clickedRow)")
}

인터페이스 빌더에서 더블 클릭 조치를 연결할 수 있습니다. 테이블보기를 통제 클릭하십시오 ( 테이블보기, 연결 패널을 가져 오려면 스크롤보기 또는 클립보기 또는 테이블 열). "보낸 동작"섹션에서 "DoubleAction"항목을 찾으십시오. 선택한 IBACTION에 연결하십시오.

Swift 4.1에서 #selector (nameofyourFunction)를 사용하여 @OBJC 함수를 수행하도록 코드 내부의 TableView 객체의 DoubleAction 메소드를 설정합니다.

이 함수 내에서 당신은 segue라고 부릅니다. 새 창을 인터페이스 빌더의 원점 창에 연결할 수 있습니다 (nstableView 객체가 아니라 실제 ViewController 객체가 아닙니다.

그런 다음 새 창에 대한 모든 설정을 수행하십시오.

인터페이스 빌더에서 먼저 : 먼저 :

enter image description here

물론 해당 Segue에 대한 식별자를 제공합니다.

enter image description here

다음으로, 첫 번째보기 컨트롤러 내부 (테이블보기가있는 위치) 코드 :

 //We use this function: prepare for segue
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
        // check if we are referring to the actual segue we want
          if segue.identifier?.rawValue == "segueToYourNewWindow" {
    // now create a reference to that new window
            let yourNewWindow = segue.destinationController as! newWindowViewController
    // now change variables inside that view controller code, remember that the objects might fail if they are not yet visible to the user so first set up the variables or call them using the main thread, up to your design.
           yourNewWindow.selectedRowVariable = thisTableView.clickedRow
        }

그런 다음 테이블 뷰의 더블 클릭에서 SEGUE를 수행 할 수있는 함수가 필요합니다.이 기능은 #Selector로 호출되므로 목표 C로 볼 수 있어야합니다 (SWIFT에서 프로그래밍하는 경우에도). 단순히 @로 기능을 시작합니다. OBJC 그게 IT입니다.

@objc func doubleClickOnResultRow() {
//beware of double-clicking also triggers this function when no rows is selected with the selectedRow being -1
 if (thisTableView.selectedRow > -1 ) {
  performSegue(withIdentifier: NSStoryboardSegue.Identifier(rawValue: "segueToYourNewWindow"), sender: nil)
 }
}

마지막 으로이 기능을 코드의 초기 설정 부분에서 다음과 같은 테이블 뷰의 이중화 메소드로 설정했습니다.

override func viewDidLoad() {
    super.viewDidLoad()
    thisTableView.doubleAction = #selector(doubleClickOnResultRow)
}

바인딩으로 똑같은 일을 할 수 있습니다.

-(IBAction)openWindow:(id)sender

.m 파일에서 동일하게 구현합니다

-(IBAction)openWindow:(id)sender
{
    //do something here;
}

테이블 뷰가있는 곳, 테이블보기를 선택하고 속성 검사의 두 번째 마지막 탭을 얻었고, 이중 CICL 인수 공개 삼각 체 확인 여우 선택 파일의 소유자, 모델 키 PAT가 "self", 선택기를 선택해야합니다. 이름은 "OpenWindow :", "Double Click Target"공개와 동일한 프로세스가 수행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top