2016-12-07 10 views
0

내 코코아 응용 프로그램에서 NSTextField (있는 그대로)와 NSScrollView (하위 클래스)가있는 창이 있습니다. 텍스트 필드와 스크롤링 뷰를 포함하는 NSView를 관리하는 NSViewController가있다.텍스트 필드와 스크롤보기를 포함하는 코코아보기의 탭 처리

앱 시작시 NSTextField에 포커스가 있고 입력하면 해당 텍스트 상자에 문자가 입력됩니다. Tab 키를 누르면 포커스가 사라집니다. 그러나 NSScrollView와 같은 인터페이스의 다른 요소는 포커스를 얻지 못합니다. 어떤 핵심 행사가 어디로 가고 있는지 말할 수 없습니다.

NSScrollView에 포커스를 전달하여 키 다운 이벤트 (예 : 화살표 키, 암시 적 검색 등)에 영향을 줄 수있는 방법은 무엇입니까?

답변

1

먼저 Tab 키를 반복해서 눌러 포커스가 스크롤보기로 전환되는지 또는 텍스트 필드로 돌아갈지를 확인해야합니다.

스크롤보기에있는 내용을 문서보기로 말하지 않습니다. 스크롤 뷰 자체가 포커스를받는 대신, 문서 뷰 또는 그 하위 뷰 중 하나가 포커스를 받아들이는 것이 일반적입니다. 그런 다음, 이동 키가 전달되어 아무 것도 소비하지 않으면 스크롤러보기에 응답 체인을 버블 링하여 자동으로 처리합니다.

스크롤 뷰에서 포커스를 허용하려면 -acceptsFirstResponder 메서드를 재정 의하여 YES을 반환해야합니다.

Tab의 동작은 창에 의해 제어됩니다. 주요 뷰 루프를 유지 관리합니다. 뷰가 추가되고 제거 될 때 키 뷰 루프를 자동으로 다시 계산할 수 있습니다. 아마도 가장 신뢰할 수있는 방법 일 것입니다. autorecalculatesKeyViewLoop 속성을 참조하십시오.

또는 autorecalculatesKeyViewLoop을 끄고 -recalculateKeyViewLoop을 호출하여 원하는대로 다시 계산하도록 수동으로 지시 할 수 있습니다.

또는 각 뷰의 nextKeyViewpreviousKeyView 속성을 코드 또는 Interface Builder에 연결하여 키 뷰 루프를 명시 적으로 설정할 수 있습니다.

+0

스크롤보기 (문서보기)에 하위보기가 여러 개 있지만 하위보기가 하나도없는 경우 텍스트 편집 필드가 표시되지 않습니다. 그러나 몇 가지 하위보기에 하위 하위보기 (바닐라 NSViews)가있는 경우 Tab을 반복적으로 두 번 누르면 스크롤보기에 초점이 표시되지 않지만 결국 텍스트 편집 필드로 돌아갑니다. 주기 길이는 하위 하위보기의 수와 관련이있는 것으로 보입니다. – jsbox

+0

하위 하위보기에서 "acceptsFirstResponder"를 해제하면 상황이 정리됩니다. 그들이 여전히 "acceptsFirstResponder"가 YES로 설정되어야한다고 생각한 이유는 mouseDown 이벤트를 허용한다는 것입니다. 그러나 스크롤 뷰에 대해 "acceptsFirstResponder"를 설정해도 기본 동작이 변경되지는 않으므로 여전히 미스테리입니다. – jsbox

+0

어떻게 스크롤 뷰가 포커스를 얻지 못하고 있다고 판단합니까? 'focusRingType'을 변경해 보셨습니까? 기본값이 none 일 수 있으므로 시각적으로 변경되지 않습니다. 어쨌든, 내가 말했듯이, 문서보기 자체가 포커스를 받아들이는 것이 더 일반적입니다. 예를 들어, 테이블보기가 스크롤보기 안에있는 경우 스크롤보기가 아닌 포커스를 허용하는 테이블보기입니다. –