启用iCloud - 停止在应用程序启动时显示的打开文件?

时间:2012-12-11 17:19:41

标签: objective-c cocoa icloud nsdocument

我刚刚将iCloud支持添加到我正在处理的应用中。它工作得很好,除了当我打开没有文档焦点的应用程序时,会出现iCloud打开文件对话框,我不想要它!

在我的app委托中,我有:

- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    [mainWindowController.window makeKeyAndOrderFront:self];
    return NO;
}

我用它来显示我自己的自定义窗口。但是现在,将显示iCloud打开文件对话框和我自己的对话框。关于如何摆脱iCloud对话框的任何想法?

Default Window

6 个答案:

答案 0 :(得分:2)

https://developer.apple.com/library/prerelease/content/releasenotes/AppKit/RN-AppKitOlderNotes/index.html

  

NSDocument支持iCloud

     

在10.8中,具有普遍性 - 容器 - 标识符权利的基于NSDocument的应用程序获得了新的功能和UI,以促进iCloud文档管理。

     

启用iCloud并首次启动或重新激活应用程序且没有可见或正在恢复的窗口时,NSDocumentController将显示一个显示用户的非模态打开面板,而不是创建新的无标题文档。 iCloud库。

     

...

     

不希望将这些功能用于其任何或所有NSDocument子类的应用程序可以覆盖+ [NSDocument usesUbiquitousStorage]并返回NO。如果所有应用程序声明的NSDocument子类都从此方法返回NO,则NSDocumentController将永远不会显示新的非模态打开面板。

因此,如果您可以放弃return NO +[NSDocument usesUbiquitousStorage]使用此发行说明中列出的功能from PyQt4 import QtCore, QtGui, QtSql import sys import sqlite3 import time import Search #Imported ui.py file import os try: from PyQt4.QtCore import QString except ImportError: QString = str class SearchDatabase(QtGui.QMainWindow, Search.Search_MainWindow): def __init__(self, tableName, parent=None): super(self.__class__, self).__init__() self.setupUi(self) self.model = QtSql.QSqlTableModel(self) self.model.setTable('CAUTI') self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) self.model.select() self.model.setHeaderData(0, QtCore.Qt.Horizontal, "MRN") self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Last Name") self.model.setHeaderData(2, QtCore.Qt.Horizontal, "First Name") self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Date of Event") self.model.setHeaderData(4, QtCore.Qt.Horizontal, "Facility") self.model.setHeaderData(5, QtCore.Qt.Horizontal, "Unit") self.model.setHeaderData(6, QtCore.Qt.Horizontal, "User") self.tableView.setModel(self.model) self.setWindowTitle("HAI Table") self.tableView.setColumnWidth(0,100) self.tableView.setColumnWidth(1,100) self.tableView.setColumnWidth(2,100) self.tableView.setColumnWidth(3,100) self.tableView.setColumnWidth(4,100) self.tableView.setColumnWidth(5,100) self.tableView.setColumnWidth(6,83) self.submitButton.clicked.connect(self.submit) self.revertButton.clicked.connect(self.model.revertAll) self.quitButton.clicked.connect(self.close) # Section 1: Signals # {i} Search Fields Button Emitted: # [1] self.search_MRN_Button.clicked.connect(self.search_MRN_FilterRecord) # [2] self.search_Lname_Button.clicked.connect(self.search_Lname_FilterRecord) # [3] self.search_Unit_Button.clicked.connect(self.search_Unit_FilterRecord) # {ii} Search Clear Buttons Emitted: # [1] self.search_MRN_CancelButton.clicked.connect(self.search_MRN_CancelButton_Clicked) # [2] self.search_Lname_CancelButton.clicked.connect(self.search_Lname_CancelButton_Clicked) # [3] self.search_Unit_CancelButton.clicked.connect(self.search_Unit_CancelButton_Clicked) # Section 1a: Slots from Section 1 [Start Line: 47] #{i} Search Field Button Slots: #[1] def search_MRN_FilterRecord(self): text = self.search_MRN.text() if len(text) == 0: self.model.setFilter("") else: self.model.setFilter("MRN = '%f'" + text) #[2] def search_Lname_FilterRecord(self): text = self.search_Lname.text() if len(text) == 0: self.model.setFilter("") else: self.model.setFilter("Surname = '%s'" % text) #[3] def search_Unit_FilterRecord(self): text = self.search_Unit.text() if len(text) == 0: self.model.setFilter("") else: self.model.setFilter("Unit = '%s'" % text) #{ii} Search Field Cancel Button Slots: #[1] def search_MRN_CancelButton_Clicked(self): self.model.setFilter("") self.search_MRN.setText("MRN Search") #[2] def search_Lname_CancelButton_Clicked(self): self.model.setFilter("") self.search_Lname.setText("Last Name Search") #[3] def search_Unit_CancelButton_Clicked(self): self.model.setFilter("") self.search_Unit.setText("Unit Search") def submit(self): self.model.database().transaction() if self.model.submitAll(): self.model.database().commit() else: self.model.database().rollback() QtGui.QMessageBox.warning(self, "HAI Table", "The database reported an error: %s" % self.model.lastError().text()) def main(): app = QtGui.QApplication(sys.argv) #app.setStyle( "Plastique" ) db = QtSql.QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('HAI.db') editor = SearchDatabase('CAUTI') editor.show() app.exec_() if __name__ == '__main__': main() # run the main function 。 我确认您仍然可以从普通对话框中将文件打开/保存到iCloud存储中。

答案 1 :(得分:1)

将以下代码放入App Delegate可以绕过iCloud弹出的新文档屏幕。为High Sierra测试。

-(void)applicationDidFinishLaunching:(NSNotification *)notification
{
    // Schedule "Checking whether document exists." into next UI Loop.
    // Because document is not restored yet. 
    // So we don't know what do we have to create new one.
    // Opened document can be identified here. (double click document file)
    NSInvocationOperation* op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(openNewDocumentIfNeeded) object:nil];
    [[NSOperationQueue mainQueue] addOperation: op];
}

-(void)openNewDocumentIfNeeded
{
    NSUInteger documentCount = [[[NSDocumentController sharedDocumentController] documents]count];

    // Open an untitled document what if there is no document. (restored, opened).       
    if(documentCount == 0){
        [[NSDocumentController sharedDocumentController]openUntitledDocumentAndDisplay:YES error: nil];
    }
}

答案 2 :(得分:0)

- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender
{
    [mainWindowController.window makeKeyAndOrderFront:self];
    return NO;
}

这部分是正确的。我刚试过它。

请确保您的该课程确实是您的应用代表。

  1. 创建一个名为 prefixAppDelegate
  2. 的新类
  3. MainMenu.xib中,将新对象拖到侧面并将其自定义类设置为应用委托类
  4. 右键点击应用,然后从委托向下拖动到您的应用委托对象。
  5. 现在只需将上面的代码粘贴到您的app delegate class
  6. 即可

    如果仍然无效,请尝试在applicationShouldOpenUntitledFile:中记录内容。

    另外,我建议不要在此方法中设置[mainWindowController.window makeKeyAndOrderFront:self];。您应该使用app委托方法applicationDidFinishLaunching:方法。

答案 3 :(得分:0)

我的观察和解决: 除了从* -info.plist中删除密钥NSDocumentClass之外,[applicationShouldOpenUntitledFile:]不会被执行。但是,如果您的应用程序是基于文档的应用程序,那么这将是有害的,它不会打开您链接的文档类型。

我的修复程序直接在-(void)applicationWillFinishLaunching:(NSNotification *)notification方法(应用程序委托)

中打开我的自定义窗口
ETDocumentWindowController *windowController =  (ETDocumentWindowController*)get your own window controller here...;
[windowController.window makeKeyAndOrderFront:nil];

答案 4 :(得分:0)

我认为我会分享我对这个问题的解决方案,因为我看到其他人仍在寻找答案。这不是一个很好的解决方案,但是可以解决问题。

  1. 子类NSDocumentController并添加以下内容:

+ (void) setCanOpenUntitledDocument: (BOOL) _canOpenUntitledDocument
{
    canOpenUntitledDocument = _canOpenUntitledDocument;
} // End of setCanOpenUntitledDocument:

- (void) openDocument: (id) sender
{
    // With iCloud enabled, the app keeps trying to run openDocument: on first launch (before apphasfinishedlaunching gets set.
    // This method lets us check and see if the app has finished launching or not. If we try to open a document before
    // its finished, then don't let it.
    if(!canOpenUntitledDocument)
    {
        return;
    } // End of appHasFinishedLaunching not set

    [super openDocument: sender];
} // End of openDocument:

将以下内容添加到您的应用程序委托中:


- (void) applicationDidFinishLaunching: (NSNotification *) aNotification
{
    // Finished launching. Let us open untitled documents.
    [SQLProDocumentController setCanOpenUntitledDocument: true];

    ...
}

推理-通过在openDocument中设置一个断点,我发现它在applicationDidFinishLaunchingapplicationShouldOpenUntitledFileapplicationShouldHandleReopen:hasVisibleWindows:之前被调用,这意味着添加这些方法是没用的。再说一次,虽然它不是很棒的代码,但是可以起作用并且可以解决问题。 (没有其他解决方案对我有用)。

答案 5 :(得分:-1)

我遇到了类似的问题 - 事实证明,在我的情况下,我必须从NSDocumentClass数组中的Info.plist中删除CFBundleDocumentTypes键和值。只有这样才能调用applicationShouldOpenUntitledFile:方法,从而允许我阻止打开iCloud / Document窗口。