1

이 엑스 코드 인터페이스 빌더 내 상황에 NSButton를 사용 가능한 상태로 결합하는 방법 :합성 조건

IB situation

또한 NSTableView는의 내용을 제어 엔티티 모드에서 NSArrayController 있습니다. NSSearchField의 텍스트가 비어 있지 않을 때 NSTableView가 비어있을 때 (Create NSSearchField) 때 Create 버튼을 활성화하고 싶습니다. 어떻게해야합니까? 프로그래밍없이 가능합니까?

'만들기'버튼의 2 가지 사용 조건을 KVO 준수 값으로 바인딩 할 수 있습니까?

답변

2

나는 인터페이스 빌더에서 완전히 할 수있는 방법이 있다고 생각하지 않지만, 적은 양의 코드로 당신은 아주 쉽게 작업을 얻을 수 있습니다. 먼저 컨트롤러 (또는 App Delegate)가 검색 ​​필드의 위임자로 설정되고 IBOutlet에 검색 필드, 버튼 및 배열 컨트롤러가 연결되어 있는지 확인하십시오. 여기에 내가 그것을 구현하는 것이 방법은 다음과 같습니다

// This is an arbitrary pointer to indicate which property has changed. 
void *kObjectsChangedContext = &kObjectsChangedContext; 

- (void)awakeFromNib { 

    // Register as an observer so we're notified when the objects change, and initially at startup. 
    [arrayController addObserver:self 
         forKeyPath:@"arrangedObjects" 
         options:NSKeyValueObservingOptionInitial 
         context:kObjectsChangedContext]; 
} 

// This updates the button state (based on your specs) 
- (void)updateButton { 

    BOOL canCreate = (searchField.stringValue.length > 0 && 
         0 == [arrayController.arrangedObjects count]); 
    [createButton setEnabled:canCreate]; 
} 

// This delegate method is called whenever the text changes; Update the button. 
- (void)controlTextDidChange:(NSNotification *)obj { 
    [self updateButton]; 
} 

// Here's where we get our KVO notifications; Update the button. 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 

    if (kObjectsChangedContext == context) 
     [self updateButton]; 

    // It's good practice to pass on any notifications we're not registered for. 
    else { 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 

그 중 일부는 그리스어처럼 보일 수 있습니다 바인딩이를 처음 사용하는 경우, 희망 의견은 충분히 명확하다.

+0

Francis,이 제품은 매우 유용하며 직접 사용될 수 있으며 문서화가 잘되어 있습니다. 그것은 나에게 그리스어가 아니지만 당신이 지금 나를 위해했던 코딩을 피하기를 바랬다.) 아무도 다른 3 일 이내에 선언적 해결책을 찾지 못하면 대답으로 표시 할 것이다. 고마워요! –

2

나는 SOOO 늦게위한 해요,하지만 다른 방법으로 와서 내 응용 프로그램에서 테스트. 그것은 작동하기 때문에 미래에이 질문을 찾을 수있는 사람들을 위해 공유 할 것입니다.

은 기본적으로 당신이하고 싶은

 @property (readonly) BOOL enableProperty; 

이이 사실 없습니다 헤더 파일에 정의

BOOL enableProperty; 

, 또는 어느 곳을 의미 컨트롤러에 대응하는 값없이 속성을 만드는 것입니다

합성하지 말고 직접 게터를 작성하고 조건을 입력하십시오.

- (BOOL) enableProperty{ 
     return (condition); 
    } 

세 번째 단계 : 언제든지 조건 변경, 그것을 통지하는 기회가.

- (void) someMethod{ 
     //.... Some code 
     [self willChangeValueForKey:@"enableProperty"]; 
     [Thisline mightChange:theCondition]; 
     [self didChangeValueForKey:@"enableProperty"]; 
     //.... Some other code 
    } 

네 번째 단계 : IB,이 "가짜"속성에 컨트롤의 enabled 속성을 바인딩합니다.

즐기십시오! ;)

1

당신은 창을 갖고있는 것 같아요, 그래서 아마도 당신이 NIB 파일의 파일의 소유자로 설정되어있는 경우 컨트롤러 객체가 있습니다.

왜 당신이 원하는 조건을 기반으로 값을 반환하는이 컨트롤러 클래스의 부울 속성을 선언하지?

@property(readonly) BOOL canCreate; 

당신이 구현하는 것이 :

-(BOOL)canCreate { 
    // compute and return the value 
} 

적절하게 KVO 알림을 보낼해야 할 때 생성 변화를위한 조건.
마지막 단계는 버튼의 enabled 바인딩을 파일 소유자 canCreate 키에 바인딩하는 것입니다.