Реализация Шаблона "мост" KVO/Bindings-Compliant в Какао

Вы можете попытаться запустить дочерний процесс в новом потоке и вызвать process.WaitForExit() после его запуска. Затем, после закрытия дочернего процесса, вы можете сфокусировать свое приложение, используя Dispatcher, поскольку текущий поток не является потоком пользовательского интерфейса.

var process = Process.Start(@"C:\Windows\system32\mspaint.exe");
process.WaitForExit();
Dispatcher.Invoke(() => MainWindow.Current.MakeFocus()); // sample line

Ваше главное окно должно иметь статическое свойство Current, и оно должно быть установлено при запуске вашего основного приложения.

6
задан Quinn Taylor 30 June 2009 в 20:10
поделиться

1 ответ

Вот проблема:

[сам willChangeValueForKey:keyPath]; <---В данный момент фактический наблюдатель должен отказаться от подписки на улицу [сам didChangeValueForKey:keyPath]; <---и добавляют себя к новому значению.

Не обеспечивая новое значение Вы отклоняете наблюдателя возможность отказаться от подписки.

Вот взломанная версия, которая работает и демонстрирует проблему.

/* --- Bridge ----------------------------------------- */
....
.....

@interface Bridge : NSObject {
    NSMutableDictionary* observedKeys;
    NSObject* obj;

    //**** Dictionary for old values just before we send the didChangeValue notification.
    NSMutableDictionary * oldValues;
}

...
.....

- (id)init {
    if( !( self = [super init] ) ) { return nil; }
    observedKeys = [NSMutableDictionary new];
    //************* Initialize the new dictionary
    oldValues = [NSMutableDictionary new];
    return self;
}
....
.....

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog( @">>>> Detected Change in keyPath: %@", keyPath );
    // ****  Cache the old value before telling everyone its going to change. 
    [oldValues setValue:[change valueForKey:NSKeyValueChangeOldKey] forKey:keyPath];
    [self willChangeValueForKey:keyPath];
    // **** Simulate the change by removing the old value.
    [oldValues removeObjectForKey:keyPath];
    // **** Now when we say we did change the value, we are not lying.
    [self didChangeValueForKey:keyPath];    
}

-(id)valueForUndefinedKey:(NSString*)key {
    // **** Important part, return oldvalue if it exists
    id oldValue;
    if(oldValue = [oldValues valueForKey:key]){
        return oldValue;
    }
    /* Register an observer for the key, if not already done */     
    if( ![observedKeys objectForKey:key] ) {
        [observedKeys setObject:[NSNumber numberWithBool:YES] forKey:key];
        NSLog(@"adding observer for:%@", key);
        [obj addObserver:self forKeyPath:key options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    } 
    return [obj valueForKey:key];
}
....
......
7
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: