2013-04-12 1 views
0

У меня есть NSButton в моих предпочтениях для взаимодействия с добавлением приложения к LoginItems. Если добавление элемента входа не выполняется, я хочу снять флажок, чтобы пользователь не получил ложное представление о том, что он был добавлен в элементы входа. Однако после этого, когда я снова нажимаю флажок, привязки не запускаются.Изменение значения привязки какао программно

enter image description here

- (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; 
} 

У меня есть привязка данных для флажка, связанного с self.automaticStartup. Если я удалю строку [self.startAtLogin setValue:[NSNumber numberWithBool:[self automaticStartup]] forKey:@"state"];, то привязки будут работать нормально, но она не отменяет, если сложение элемента не выполняется.

Как я могу изменить это значение привязки программным образом, чтобы каждое другое событие привязки не игнорировалось?

ответ

0

С вашего объяснения, ваше обязательное значение automaticStartup, но вы отправляете willChangeValueForKey: за startAtLogin. Для правильной работы привязок вам нужно в какой-то момент предупредить об изменении привязки переменной. Однако, поскольку вы находитесь в разгаре setAutomaticStartup: в то время, здесь небезопасно это делать.

В этом случае я не буду использовать привязки для выполнения самого изменения, я бы рассмотрел механизм старого стиля IBAction, а затем установил значение флажка вручную с помощью IBOutlet, когда вы сможете подтвердить статус.