2013-10-15 84 views
2

我試圖實現屬性面板作爲基於NSDocument的應用程序的輔助窗口。該實現顯示了NSWindow(通過NSWindowController)。撤消輔助NSWindow,可可

目標是,如果主(文檔)或輔助(屬性窗口)中的任何一個處於活動狀態,則輔助窗口中的屬性修改器(「屬性窗口」)應該可以使用CMD-Z進行撤消。

出於某種原因,這是逃避我。

我目前的實施/測試是非常基本的。 爲了測試這個想法,我有一個NSSlider綁定到一個名爲'aValue'的屬性,暴露在「Properties」NWindowController上。這是這樣的:

- (void) undoAValueUsing:(int)oldValue { 
    self.aValue = oldValue; 
} 

- (void)setAValue:(int)aValue { 
    if(aValue != _aValue) { 
    NSLog(@"Value is now: %d", aValue); 
    [[self.undoManager prepareWithInvocationTarget:self] undoAValueUsing:_aValue]; 
    [self.undoManager setActionName:@"Ra"]; 
    _aValue = aValue; 
} 

因此,任何對屬性的更改都會記錄「撤消」操作。

問題是,沒有撤消出現......就好像它沒有註冊,或者如果活動菜單項正在查看其他撤消管理器。 CMD-Z只是產生一個「嘟嘟」(aka:noop)。

完整的代碼這個簡單的例子是在這裏:https://dl.dropboxusercontent.com/u/421935/TestApp/Test.zip

的想法是,你按一下按鈕,查看屬性面板,修改最上面的滑塊(沒有其他滑塊已撤消執行),你應該能夠CMD-Z取消它。

btw:如果你看看示例代碼,你會發現我已經嘗試將自定義窗口manager.undoManager設置爲document.undoManager。它沒有任何區別。

嗯。我覺得我瘋了。這應該這麼簡單! 必須錯過明顯的東西!

任何啓示o人的互聯網?

回答

2

原來的答案很簡單。將文檔設置爲NSWindow的代表(次要文檔)。然後執行:

- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window 

關於Document,返回Doc的undoManager。

完成。