2

NSTextFieldCell이 포함 된 3 개의 열이있는 tableView가 있습니다. 모든 것은 바인딩으로 채워집니다.편집 모드에서 NSTextFieldCell을 만드는 방법은 NSTextField 대신 사용자 정의보기를 표시합니까?

열 중 하나의 셀 텍스트가 계산되어 직접 편집 할 수 없습니다. 이 열에 대해서는 셀이 편집 모드으로 바뀌면 , 에는 텍스트 필드 대신 단추 또는 사용자 정의보기가 표시됩니다.
는 다른 방법으로는, 내가 편집되지 않는 경우 NSTextFieldCellNSCell에, 편집되는 NSButtonCell (또는 사용자 정의보기를) 원하는 말했다.

여기에 대한 힌트는 무엇입니까?

가 나는 NSTextFieldCell를 서브 클래스하고 문제가 NSButton입니다> = 아래 그림처럼 fieldEditorForView:를 오버라이드 (override) :

  • # 1보십시오 : 여기

    내가 성공하지, 뭘하려 나는 setDelegate:와 아마 많은 다른 재료에 반응하지 않는 것을 돌려주고있다.

    - (NSTextView *)fieldEditorForView:(NSView *)aControlView { 
    
        NSTableView *tableView = (NSTableView *) aControlView; 
    
        // Manually computing column and row index for testing purposes 
        NSButton* button = [[NSButton alloc] initWithFrame:[tableView frameOfCellAtColumn:2 row:2]]; 
    
        return (NSTextView *)button; 
    } 
    
    • # 2보십시오 :

    서브 클래스 NSTextFieldCell 및이 방법은 편집 모드에서 셀하지를 그리는 데 사용 =>drawWithFrame: inView: 우선합니다.

    • # 3보십시오 :

    이 리드 몇 가지 가능성이있다,하지만 나는 분명히 여기서 뭔가를 누락.
    windowWillReturnFieldEditor: toObject:을 내 윈도우의 위임에 구현하고 사용자 정의 필드 편집기를 반환하십시오. 나는 옳은 길에있는 것처럼 보였지만 나는 무엇인가 놓쳤다. 인자 anObject는 절대로 내 사용자 정의 셀이 아닙니다 (이중 체크하고 XIB에서 올바르게 정의되었습니다). 그것은 나에게 이렇게하는 가장 좋은 방법을 보인다

    - (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)anObject 
    { 
        if ([anObject isKindOfClass:[NSCellTextAndButtonAtEditTime class]]) 
        { 
         NSLog(@"Going there"); 
    
         NSButton* button = [[NSButton alloc] initWithFrame:CGRectMake(0, 0, 300, 20)]; 
         button.title = @"test"; 
    
         return button; 
        } 
        return nil; 
    } 
    

답변

2

이를 NSTextView를 서브 클래스 사용자 정의 셀에 대한 새 사용자 정의 필드 편집기를 제작 한 다음 그것을 팔고 다니다하는 사용자 정의 셀에 - (NSTextView *)fieldEditorForView:(NSView *)aControlView을 무시하는 것입니다. NSTextFieldCell의 편집기가 NSTextView가 될 것이라는 기대는 꽤 필수적입니다. 아마 버튼을 반환하려는 시도가 실패한 것일 수 있습니다. 단추를 표시하는 간단한 예제를 작성하고 단추를 누르면 텍스트 필드 셀의 값을 현재 시간으로 업데이트하고 편집을 끝냅니다.어쩌면 도움이 될 것입니다 :

@interface SOMyEditor : NSTextView 
@end 

@interface SOMyEditor() 
- (void)p_buttonPressed: (id)sender; 
@end 

@implementation SOMyEditor 

- (id)initWithFrame:(NSRect)frameRect textContainer:(NSTextContainer *)container; 
{ 
    if (self = [super initWithFrame: frameRect textContainer:container]) 
    { 
     NSButton* button = [[[NSButton alloc] initWithFrame: NSMakeRect(0,0,frameRect.size.width, frameRect.size.height)] autorelease]; 
     button.title = @"Update Time!"; 
     button.target = self; 
     button.action = @selector(p_buttonPressed:); 
     button.autoresizingMask |= NSViewWidthSizable | NSViewHeightSizable; 
     self.autoresizesSubviews = YES; 
     [self addSubview: button]; 
    } 
    return self; 
} 

- (void)p_buttonPressed: (id)sender 
{ 
    NSString* string = [[NSDate date] description]; 
    [self insertText: string]; 
    [self didChangeText]; 
    [self.window endEditingFor: self]; 
} 

@end 

는 그런 다음 사용자 정의 셀 클래스가 같은 것을 할 :

여기에 트릭의 몇 가지가 있습니다
@interface SOMyCustomTextFieldCell : NSTextFieldCell 
@end 

@interface SOMyCustomTextFieldCell() 
@property (retain) NSTextView* fieldEditor; 
@end 

@implementation SOMyCustomTextFieldCell 
@synthesize fieldEditor = _fieldEditor; 

- (NSTextView *)fieldEditorForView:(NSView *)aControlView 
{ 
    if (nil == _fieldEditor) 
    { 
     _fieldEditor = [[SOMyEditor alloc] init]; 
     _fieldEditor.fieldEditor = YES; 
    } 

    return self.fieldEditor;  
} 

- (void)dealloc 
{ 
    [_fieldEditor release]; 
    [super dealloc]; 
} 

@end 

. 먼저, 셀이 NSTextFieldCell 인 한, 편집기는 NSTextView의 서브 클래스 여야합니다. NSTextView를 서브 클래 싱하는 것은 많은 보일러 판 (boilerplate) 동작을 제공합니다 (여러분이 일반적으로 원하는 모든 동작을 알고 편집을 위해 NSTextFieldCell을 사용하지 않아도 됨). 응용 프로그램에 텍스트 편집기가있는 것처럼 행동하지 않게하려면 NSTextView의 정상적인 동작을 사용하지 않도록 설정해야합니다.

두 번째로 - (NSTextView *)fieldEditorForView:(NSView *)aControlView을 덮어 쓰면 여러 번 호출 할 때 동일한 셀에 대해 동일한 필드 편집기를 반환하는 것이 중요합니다. 해당 메서드에 대한 모든 호출에서 새로운 NSTextView를 만들면 올바르게 작동하지 않습니다.

희망이 도움이됩니다.