У меня есть 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;
}
У меня есть привязка данных для флажка, связанного с self.automaticStartup
. Если я удалю строку [self.startAtLogin setValue:[NSNumber numberWithBool:[self automaticStartup]] forKey:@"state"];
, то привязки будут работать нормально, но она не отменяет, если сложение элемента не выполняется.
Как я могу изменить это значение привязки программным образом, чтобы каждое другое событие привязки не игнорировалось?