2011-03-10 2 views
5

두 클래스가 있습니다. ManagingViewController, NSViewController의 서브 클래스, ViewController, ManagingViewController의 서브 클래스. ViewController에서 firstResponder가되고 싶은 NSTextField가 있지만 관리하지는 못했습니다.NSViewController의 firstResponder

따라서 firstResponder로 설정된 NSTextField를 제외하고 Hillegass의 Mac OS X 용 Cocoa 프로그래밍 책 (Download of the book's examples)의 29 장과 거의 같습니다.

아무도 올바른 방법을 가르쳐 줄 수 있습니까?

+0

함께 작업하는 코드를 게시 할 수 있습니까? – Tim

+0

책의 예를보십시오 (29_ViewSwapping). Department Builder.nib – lueda

+0

에 대한 두 개의 NSTextFields와 Interface Builder를 사용한 것만으로 DepartmentViewController.h에'IBOutlet NSTextField * test;'와'IBOutlet NSTextField * test2; 쉽게 설정할 수 있습니다 –

답변

1

[[myTextField window] makeFirstResponder:myTextField];을 사용해 보셨습니까?

+0

'-awakeFromNib'에서 이것을 시도했지만 나에게 도움이되지 않습니다. firstResponder는 여전히 잘못된 필드입니다. – lueda

+0

nib에서'initialFirstResponder' 설정을 시도 했습니까? – Richard

+1

사용자 지정보기에는 initialFirstResponder가 없습니다. 창만 있기 때문에 NSViewController 내부에서 창을 호출해야한다고 생각합니다 (첫 번째 제안처럼). 그러나 나는 어떻게 될지 모른다. – lueda

-3

간단합니다. 인터페이스 빌더에서 xib 파일로 이동하십시오. 첫 번째 응답자 필드를 마우스 오른쪽 버튼으로 클릭하십시오. 연결을 표시하고 연결을 제거한 다음 원하는 응답자에 연결합니다. 이게 작동하는지 알려주세요

+0

위의 답변에 대한 의견을보세요! – lueda

+0

적어도 osx에서는 작동하지 않습니다. – Borzh

6

-[NSWindow makeFirstResponder:]을 사용하여 텍스트 필드를 첫 번째 응답자로 설정해야합니다.

이 방법은 NSWindow 방법이므로 해당보기를 창에 추가 한 후에 만, 즉 창보기 계층 구조 안에 하위보기로보기를 추가 한 후에 만 ​​의미가 있습니다. 이 책의 예에서,보기를 창 안의 상자의 내용보기로 설정하면 이런 일이 발생합니다. 예를 들어 :

- (void)displayViewController:(ManagingViewController *vc) { 
    // Try to end editing 
    NSWindow *w = [box window]; 
    … 

    // Put the view in the box 
    NSView *v = [vc view]; 
    [box setContentView:v]; 

    // Set the first responder 
    if ([vc class] == [ViewController class]) { 
     [w makeFirstResponder:[(ViewController *)vc myTextField]]; 
    } 
} 

ViewController-myTextField라는 getter 메소드를 노출 가정합니다.

보기 컨트롤러가 첫 번째 응답자로 권장하는 개체를 반환하는 메서드를보기 컨트롤러에 표시시켜 더 일반화 할 수 있습니다.

@interface ManagingViewController : NSViewController 
… 
- (NSResponder *)recommendedFirstResponder; 
@end 

@implementation ManagingViewController 
… 
- (NSResponder *)recommendedFirstResponder { return nil; } 
@end 

그리고 ManagingViewController 당신의 구상 서브 클래스는, -recommendedFirstResponder 반환 창의 첫 번째로 반응해야한다 물체가에 : 뭔가 같은

@implementation ViewController 
… 
- (NSResponder *)recommendedFirstResponder { return myTextField; } 
@end 

그 일을 갖는, 당신이 뭔가에 -displayViewController:을 변경할 수 있습니다 like :

- (void)displayViewController:(ManagingViewController *vc) { 
    // Try to end editing 
    NSWindow *w = [box window]; 
    … 

    // Put the view in the box 
    NSView *v = [vc view]; 
    [box setContentView:v]; 

    // Set the first responder 
    NSResponder *recommendedResponder = [vc recommendedFirstResponder]; 
    if (recommendedResponder) [w makeFirstResponder:recommendedResponder]; 
} 
+0

이것은 정확히 내가 찾고있는 것입니다. NSViewController에 구현되었고 작동합니다. 그러나 필자는 모든 견해가 필드가 첫 번째 응답자가되는 것에 신경을 쓰지 않으므로 @ 옵션으로했습니다. – SilverSideDown

관련 문제