如何在显示工作表时启用撤消菜单项

时间:2015-01-13 21:15:57

标签: cocoa swift segue osx-yosemite nsstoryboard

我正在使用故事板创建基于文档的核心数据OSX应用程序。撤消和重做工作正常,直到我在带有segue的工作表中呈现视图控制器。显示工作表后,撤消/重做按钮将显示为灰色。

在搜索可能的解决方案时,我遇到了this article,他们说我必须在我的窗口中使用 " windowWillReturnUndoManager:"委托方法。所以我在我的segue的sourceController中实现了这个方法,并将该控制器设置为prepareForSegue方法中destinationController窗口的委托,如下所示:

override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
    super.prepareForSegue(segue, sender: sender)
    (segue.destinationController as NSViewController).view.window?.delegate = self
}

func windowWillReturnUndoManager(window: NSWindow) -> NSUndoManager? {
    println(undoManager)
    return undoManager
}

但是当我打开工作表时,撤消和重做按钮仍然显示为灰色。请注意,将segue样式更改为popover时,undo / redo工作正常。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并在此处发布以防万一。我的解决方案是为图纸视图控制器所连接的窗口获取撤消管理器:

std::string infostring;
while( GL_NO_ERROR != glGetError() ); /* Flush Errors */

GLenum err;
glCompileShader( VSID );
if( GL_NO_ERROR == (err = glGetError())
){
    GLint vstat = 0;
    glGetShaderiv( VSID, GL_COMPILE_STATUS, &vstat );

    if( (GL_NO_ERROR == (err = glGetError()))
     && vstat != GL_TRUE
    ){
        GLint infolen = 0;
        glGetShaderiv( VSID, GL_INFO_LOG_LENGTH, &infolen );
        if( (GL_NO_ERROR == (err = glGetError()))
         && 0 < infolen
        ){
            GLsizei returned_infolen = 0;
            infostring = std::string(infolen, 0);
            glGetShaderInfoLog( VSID, infolen, &returned_infolen, infostring.data() );
            infostring.resize(returned_infolen);

            err = glGetError();
    }
}
if( GL_NO_ERROR != err
){
       std::stringstream Error;
        Error << "An Error occured while trying to compile"\
            " Vertex Shader \"" << VertexShaderPath
            << "\":\n\n" << infostring;
}
在这种情况下,

let undoManager = self.view.window?.firstResponder?.undoManager 是工作表的视图控制器,而不是工作表的父视图控制器。因此,分配将在工作表的视图控制器内进行。