내 기본 설정에 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"];
줄을 제거하면 바인딩이 제대로 작동하지만 항목을 추가하지 않으면 선택을 취소하지 않습니다.
이 바인딩 값을 프로그래밍 방식으로 변경하여 다른 모든 바인딩 이벤트가 무시되지 않도록하려면 어떻게해야합니까?