확인이 항목은 정말 어려움이 있습니다. NSTextFieldCell을 함께 결합한 체크 박스를 만들고 싶습니다. 마우스가 텍스트가 아닌 상자를 친다면 체크 박스 이 켜짐이 중요합니다. 다소 많았지 만, 문제가 마우스 이벤트를 수신 중입니다. 한 행의 확인란을 하나만 클릭했기 때문에 모든 이벤트가 NSOnState로 바뀌었기 때문에 문제가 발생했습니다. 나는 을 사용하여 내가 수행 한 작업과 다양한 실패한 시도를 표시하고 이 작업을 수행합니다.마우스 클릭/마우스 이벤트를 처리하기 위해 NSButtonCell 인스턴스를 사용하여 사용자 지정 NSCell 가져 오기
그래서 이것은 내가 지금까지 그것을 한 적이 방법입니다
헤더 :
@interface MyCheckboxCellToo : NSTextFieldCell {
NSButtonCell *_checkboxCell;
}
구현 : 나는 아마 일을하지 말아야 알고
- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView {
NSPoint point = [controlView convertPoint:[event locationInWindow] fromView:nil];
NSLog(@"%@", NSStringFromPoint(point));
NSRect checkFrame;
NSDivideRect(cellFrame, &checkFrame, &cellFrame, cellFrame.size.height/*3 + [[_checkboxCell image] size].width*/, NSMinXEdge);
if (NSMouseInRect(point, checkFrame, [controlView isFlipped])) {
// the checkbox, or the small region around it, was hit. so let's flip the state
NSCellStateValue checkState = ([_checkboxCell state] == NSOnState) ? NSOffState:NSOnState;
[self setState:checkState];
[_checkboxCell setState:checkState];
[controlView setNeedsDisplay:YES];
return NSCellHitTrackableArea;
}
return [super hitTestForEvent:event inRect:cellFrame ofView:controlView];
}
:
거기[self setState:checkState];
[_checkboxCell setState:checkState];
[controlView setNeedsDisplay:YES];
... becaus 결과적으로 매번 모든 체크 박스는 NSOnState로 이동합니다. 세포가 재사용 되었기 때문입니까? ImageAndTextCell은 어떻게 동일한 테이블 뷰에서 서로 다른 이미지를 가질 수 있습니까? 마우스 이벤트를 어떻게 처리합니까? 내가 시도
:
- (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame
ofView:(NSView *)controlView untilMouseUp:(BOOL)untilMouseUp {
NSLog(@"%s %@", _cmd, theEvent);
return [_checkboxCell trackMouse:theEvent inRect:cellFrame
ofView:controlView untilMouseUp:untilMouseUp];
// return YES;
// return [super trackMouse:theEvent inRect:cellFrame
ofView:controlView untilMouseUp:untilMouseUp];
}
- (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView {
NSLog(@"%s %@", _cmd, NSStringFromPoint(startPoint));
return [super startTrackingAt:startPoint inView:controlView];
}
- (BOOL)continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint
inView:(NSView *)controlView {
NSLog(@"%s %@", _cmd, NSStringFromPoint(currentPoint));
return [super continueTracking:lastPoint at:currentPoint
inView:controlView];
}
- (void)stopTracking:(NSPoint)lastPoint at:(NSPoint)stopPoint
inView:(NSView *)controlView mouseIsUp:(BOOL)flag {
NSLog(@"%s %d %@", _cmd, flag, NSStringFromPoint(stopPoint));
}
trackMouse : ..., continueTracking : ...이 startTrackingAt
하지만
를 호출됩니다 않습니다 ... 그리고 stopTracking ... . "hit area"체크 상자를 클릭 할 때 호출되지 않음trackMouse에서 ... 시도했습니다 ... 시도했습니다
return [_checkboxCell trackMouse:theEvent inRect:cellFrame ofView:controlView untilMouseUp:untilMouseUp];
및
return [super trackMouse:theEvent inRect:cellFrame ofView:controlView untilMouseUp:untilMouseUp];
와도 마우스 이벤트는 체크 박스에 의해 처리되고이 발생할 것으로 보인다.
NSOnState로 이동하려면 어떻게하나요? 나는 내가 예쁘다고 알고있다. 그러나 많은 doc 독서와 google 검색 후에 나는 이것을 해결하는 데 성공했다. .
제안을 환영 의견 .. 여기 OK
객체의 생성과 파괴를 보여주기 위해 좀 더있다 ..
- (id)init {
if ((self = [super init])) {
_checkboxCell = [[NSButtonCell alloc] init];
[_checkboxCell setButtonType:NSSwitchButton];
[_checkboxCell setTitle:@""];
[_checkboxCell setTarget:self];
[_checkboxCell setImagePosition:NSImageLeft];
[_checkboxCell setControlSize:NSRegularControlSize];
}
return self;
}
- copyWithZone:(NSZone *)zone {
MyCheckboxCellToo *cell = (MyCheckboxCellToo *)[super copyWithZone:zone];
cell->_checkboxCell = [_checkboxCell copyWithZone:zone];
return cell;
}
- (void)dealloc {
[_checkboxCell release];
[super dealloc];
}
확인란과 텍스트 필드가 모델 개체의 여러 속성을 참조하기 때문에 이러한 별도의 열을 만드는 것이 더 쉽습니다. (당신은 그것들을 어떻게 든 동일한 속성을 참조합니까?) –
텍스트를 클릭하면 사용자가 항목을 선택하지 않아도 '탐색'할 수 있도록 기능을 분할합니다 (확인란이 수행함). – maz