2013-04-12 3 views
0

내 기본 설정에 NSButton이 있는데이 응용 프로그램을 LoginItems에 추가하는 것과 상호 작용합니다. 로그인 항목을 추가하지 못하면 해당 상자를 선택 취소하여 사용자가 로그인 항목에 추가되었다는 잘못된 인식을 얻지 못하도록합니다. 그러나이 작업을 수행 한 후 확인란을 다시 클릭하면 바인딩이 트리거되지 않습니다. 프로그래밍 방식으로 코코아 바인딩 값 변경

- (void)addLoginItem:(BOOL)status 
{ 
    NSURL *url = [[[NSBundle mainBundle] bundleURL] URLByAppendingPathComponent: 
        @"Contents/Library/LoginItems/HelperApp.app"]; 

    // Registering helper app 
    if (LSRegisterURL((__bridge CFURLRef)url, true) != noErr) { 
     NSLog(@"LSRegisterURL failed!"); 
    } 

    if (!SMLoginItemSetEnabled((__bridge CFStringRef)[[NSBundle mainBundle] bundleIdentifier], (status) ? true : false)) { 
     NSLog(@"SMLoginItemSetEnabled failed!"); 
     [self willChangeValueForKey:@"startAtLogin"]; 
     [self.startAtLogin setValue:[NSNumber numberWithBool:[self automaticStartup]] forKey:@"state"]; 
     [self didChangeValueForKey:@"startAtLogin"]; 
    } 
} 

- (void)setAutomaticStartup:(BOOL)state 
{ 
    NSLog(@"Set automatic startup: %d", state); 
    if ([self respondsToSelector:@selector(addLoginItem:)]) { 
     [self addLoginItem:state]; 
    } 
} 

- (BOOL)automaticStartup 
{ 

    BOOL isEnabled = NO; 

    // the easy and sane method (SMJobCopyDictionary) can pose problems when sandboxed. -_- 
    CFArrayRef cfJobDicts = SMCopyAllJobDictionaries(kSMDomainUserLaunchd); 
    NSArray* jobDicts = CFBridgingRelease(cfJobDicts); 

    if (jobDicts && [jobDicts count] > 0) { 
     for (NSDictionary* job in jobDicts) { 
      if ([[[NSBundle mainBundle] bundleIdentifier] isEqualToString:[job objectForKey:@"Label"]]) { 
       isEnabled = [[job objectForKey:@"OnDemand"] boolValue]; 
       break; 
      } 
     } 
    } 
    NSLog(@"Is Enabled: %d", isEnabled); 
// if (isEnabled != _enabled) { 
    [self willChangeValueForKey:@"startupEnabled"]; 
     startupEnabled = isEnabled; 
    [self didChangeValueForKey:@"startupEnabled"]; 
// } 

    return isEnabled; 
} 

enter image description here

나는 self.automaticStartup에 바인딩 체크 박스 내 데이터 바인딩이있다. [self.startAtLogin setValue:[NSNumber numberWithBool:[self automaticStartup]] forKey:@"state"]; 줄을 제거하면 바인딩이 제대로 작동하지만 항목을 추가하지 않으면 선택을 취소하지 않습니다.

이 바인딩 값을 프로그래밍 방식으로 변경하여 다른 모든 바인딩 이벤트가 무시되지 않도록하려면 어떻게해야합니까?

답변

0

설명에서 바운드 값은 automaticStartup이지만 startAtLoginwillChangeValueForKey:입니다. 바인딩이 제대로 작동하려면 바인딩 된 변수의 변경 사항에 대해 어느 시점에서 경고해야합니다. 그러나 그 당시에는 setAutomaticStartup:의 한가운데에 있기 때문에 여기서는 그렇게하는 것이 안전하지 않습니다.

이 경우 변경을 수행하기 위해 바인딩을 사용하지 않기 때문에 이전 스타일의 IBAction 메커니즘을 고려한 다음 상태를 확인할 수있는 경우 IBOutlet을 통해 수동으로 확인란 값을 설정하십시오.

관련 문제