2008-10-11 7 views
5

사용자가 NSTableView에서 셀 편집을 마칠 때를 알아야합니다. 이 테이블에는 사용자 캘린더 (CalCalendarStore에서 가져온 것)가 모두 들어 있으므로 사용자의 변경 사항을 저장하려면 CalCalendarStore에 변경 사항을 알려야합니다. 그러나 사용자가 편집을 마친 후에는 아무 것도 찾을 수 없습니다. 테이블의 대리자에 메서드가있는 것 같지만 편집이 시작될 때 호출되고 편집이 끝날 때 호출되지 않습니다.사용자가 NSTableView에서 셀 편집을 완료하면 어떻게 알림을받을 수 있습니까?

답변

2

하위 클래스 NSTableView 및 override textDidEndEditing : (반드시 super 구현을 호출해야 함).

텍스트 필드 NSTextFieldCell 또는 NSComboBoxCell에 의해서만 호출됩니다 (단, 콤보 메뉴에서 값을 선택하는 대신 값을 변경하여 값을 변경할 때만).

+0

그게 효과가있는 것 같습니다. 고맙습니다. :) – Andy

1

NSTableDataSource 프로토콜을 살펴보십시오. 당신이 찾고있는 메시지가 호출됩니다 : tableView : setObjectValue : forTableColumn : 행 :

+1

이 아마 정답 :

// Setup editing completion notifications NotificationCenter.default.addObserver(self, selector: #selector(editingDidEnd(_:)), name: NSNotification.Name.NSControlTextDidEndEditing, object: nil) 

기능 통지를 처리한다. 즉, 셀 기반 테이블에서만 작동합니다. 뷰 기반 테이블을 사용하는 경우 해당 메소드는 절대로 호출되지 않습니다. – dgatwood

1

내 경우에는 작동하지 않는 것 같습니다. 내 컨트롤러 클래스를 DataSource로 테이블에 설정했지만 메서드가 호출되지 않았습니다. 데이터는 내 테이블이 NSArrayController의 값에 바인딩되어 있습니다. 왜 내 객체가 호출되지 않았을 수 있습니까? toObjectsAtIndexes : forKeyPath : 옵션 : 컨텍스트 : 당신은 또한 당신이 개체에 대한 통지되도록, 배열 자체에 대한 관찰자를 설정해야합니다

2

는 addObserver를 사용하여 콘텐츠 배열의 각 항목에 대한 관측을 설정 배열에 추가되거나 제거됩니다.

예를 들어 iSpend 프로젝트를 살펴보십시오.

-1

하위 클래스 NSArrayController 및 override objectDidEndEditing : (반드시 super의 구현을 호출해야 함).

대부분이 텍스트 필드 NSTextFieldCell 또는 NSComboBoxCell에 의해서만 호출됩니다 (단, 콤보 메뉴에서 값을 선택하는 대신 값을 변경하여 값을 변경할 때만). 다른 셀을 호출 할 수있는 셀이있을 수 있지만 어느 셀이 확실하지는 않습니다. 사용자 지정 셀을 사용하는 경우 NSEditor 및 NSEditorRegistration 비공식 프로토콜을 구현하는 것이 좋습니다.

14

NSNotificationCenter을 사용하거나 NSControl 방법을 사용하여 NSTableView의 서브 클래 싱없이 동일한 결과를 얻을 수 있습니다. 여기에 애플의 문서를 참조하십시오 :

http://developer.apple.com/library/mac/#qa/qa1551/_index.html

그것은 줄의 코드 만 부부의 나를 위해 완벽했다.


당신의 delegate 될 수있는 경우 NSTableView 당신은 NSTableView이 포함 된 NSControl 요소의 delegate이며, 그 방법에 호출을 전송, 방법에게 사실

- (void)controlTextDidEndEditing:(NSNotification *)obj { ... } 

를 구현해야

: 그 delegate 그렇지 않으면

NSNotificationCenter를 사용 (유용한 다른 방법이 있습니다) 스위프트 3에 밀리의 대답 @ 번역

// where you instantiate the table view [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(editingDidEnd:) name:NSControlTextDidEndEditingNotification object:nil]; // somewhere else in the .m file - (void)editingDidEnd:(NSNotification *)notification { ... } // remove the observer in the dealloc - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:NSControlTextDidEndEditingNotification object:nil]; [super dealloc] } 
+1

셀 기반 뷰 기반 뷰 기반 뷰 기반 뷰 기반 테이블을 사용하는지 여부에 따라 올바르거나 잘못되었습니다. 셀 기반 테이블을 사용하고 있고 변경 내용을 쓰는 것이 목표 인 경우이 알림은 * before * tableView : setObjectValue : forTableColumn : row : 메서드가 호출되어 값을 저장하기 전에 전송되기 때문에 작동하지 않습니다. 데이터 소스이므로 이전 값을 쓸 것입니다. – dgatwood

+0

실제로보기 기반 테이블보기에서이 알림이 전혀 표시되지 않습니다. –

0

:

func editingDidEnd(_ obj: Notification) { 
    guard let newName = (obj.object as? NSTextField)?.stringValue else { 
     return 
    } 

    // post editing logic goes here 
} 
관련 문제