2

인터페이스 글루 코드에 대해 걱정할 필요가 없도록 수동으로 동기화 된 인터페이스 모델에서 바인딩 모델로 내 Cocoa 프로젝트를 변환하는 데 문제가 있습니다.코코아 바인딩 문제; 바운드 테이블 열에 데이터가 표시되지 않고 콘솔에 오류가 표시되지 않습니다.

코코아 데브 센트럴 Cocoa Bindings tutorial을 따라 모든베이스를 덮었지만 제대로 작동하지 않습니다. 마스터 - 세부 인터페이스가 있지만 인터페이스의 마스터 부분이 제대로 작동하는 데 문제가 있습니다. 튜토리얼에 표시된 것과 유사한 바인딩 모델을 설정했지만 마스터 열에는 데이터가 표시되지 않습니다. 나는 모든 컨트롤러와 객체가 -(id)key-(void)setKey:(id)key 메쏘드를 가지고 있는지 확인했다. 바인딩을 준수하고, 내 컨트롤러에 ControllerAlias ​​객체를 생성하고, 컨트롤러에 연결하고, NSArrayController 중 하나에 바인딩하는 NSArrayController를 생성했다. ControllerAlias가 연결되는 클래스의 NSMutableArrays가 배열에 포함 된 개체 유형을 설정했는지 확인한 다음 테이블 열을 NSArrayController에 바인딩했습니다.

콘솔에서 아무런 오류가 없으며 NSBindingDebugLogLevel을 1로 설정해도 오류가 발생하지 않습니다. 그러면 문제가 무엇인지 파악하는 데 도움이됩니다.

내가 제대로 작동하는지 확인하는 유일한 방법은 실제로 NSArrayController에 연결하는 NSMutableArray가 실제로 그 안에 뭔가 있는지 확인하는 것입니다.

제안 사항? 내가 확인해야 할 코코아 바인딩이있는 다른 전형적인 함정은 무엇입니까?

답변

1

키에 중단 점을 넣었습니까? 전화 걸기 여부를 확인하는 방법? 그렇지 않으면 배열에 항목이 있음을 확인했기 때문에 테이블 열에 바인딩을 위해 무언가가 올바르게 설정되지 않았 음을 나타냅니다.

더 이상 오브젝트 컨트롤러를 작성하지 않아도됩니다. (이 튜토리얼은 약간 오래된 것입니다.) NIB에서 Object를 만들고 클래스를 Controller 클래스로 설정하십시오. ObjectController 대신 바인딩을 직접 설정할 수 있습니다.

  1. 는 NIB에서 내 컨트롤러의 인스턴스를 만듭니다

    내가 다음을 수행, 바인딩을 설정합니다.

  2. NSArrayController를 만들고 컨트롤러의 배열에 바인딩하십시오.
  3. 테이블의 각 열에 대해 값을 배열 컨트롤러의 개체 구성원에 바인딩하십시오.

당신이해야 할 모든 것이 있어야합니다. 나는 바인딩이 처음 몇 개정판에 소개 된 이래로 이것을 정리했습니다.

0

내 펜촉에 ControllerAlias ​​객체를 생성 한,

"컨트롤러 별명이"무엇

? 이 모델, 컨트롤러 또는 뷰입니까?

당신은 무엇을 의미합니까, 내 컨트롤러에 연결?

는 ControllerAlias가 연결 클래스의 NSMutableArrays 중 하나에 결합하는 NSArrayController,

클래스가 NSMutableArray들 필요는 없습니다 만들었습니다.

배열 컨트롤러의 어떤 속성을 바인딩 했습니까?

어떤 개체에 바인딩 했습니까?

해당 개체의 어떤 키 경로를 바인딩 했습니까?

... 그리고 NSArrayController에 테이블 열을 바인딩했습니다.

어떤 테이블 열의 속성을 바인딩 했습니까?

어레이 컨트롤러의 어떤 속성 (키 경로)을 바인딩 했습니까?

0

그래서 원래의 코드에서 awakeFromNib (NSArrayController가 나타내는 어레이)를 init이 아니고 수정 했으므로 인터페이스가 변경되지 않았으므로 변경 사항이 인터페이스에 반영되지 않았습니다. 키 - 값 관측 방법.

나는에

theArray = [[NSMutableArray alloc] init]; 
[theArray addObject:newThing]; 

에서 코드를 변경 : - 대신의 (ID) init 메소드 - 나는 다른 솔루션이에서 로딩 할 생각

theArray = [[NSMutableArray alloc] init]; 
NSMutableArray *bindingsCompliantArray = [self mutableArrayValueForKey:@"things"]; 
[bindingsCompliantArray addObject:newThing]; 

(무효) awakeFromNib 메서드는 더 큰 리팩터가 필요했기 때문에 그렇게하지 않았습니다.

NSArrayController를 통해 배열 목록에 새로운 것을 만들기위한 버튼을 추가하여 이것을 알아 냈습니다. 버튼을 클릭하면 새로운 것이 배열에 추가되었고 기존 배열도 마술처럼 나타났습니다.

+0

또 다른 방법은 (내 의견으로는) '-addThingsObject :'접근자를 추가하는 것입니다 (속성의 이름이 "things"라고 가정). 그러면'-awakeFromNib'의 코드는'[self addThingsObject : newThing];'입니다. –

+0

기본 배열 대신 NSArrayController에 직접 객체를 추가하면 awakeFromNib에 코드를 유지할 수 있습니다. 그러면 바인딩 항목에 새 항목에 대한 알림이 표시되고 UI가 적절하게 업데이트됩니다. – Andy