我要求我的小项目的用户打开一个finder窗口并选择一个或多个对象。也允许选择none。在这种情况下,使用所有项目。
在我的应用中,我检查第一个窗口并尝试获取所选项目(文件或文件夹),请参阅 Code1 。
*请注意,有些变量是全局的,并在.h中声明,有些变量只是重置。 *
如果用户没有在取景器中徘徊,这可以正常工作。但他可以做几件事来欺骗我的应用程序。他可以打开一个取景器窗口,例如并选择几个文件。之后,他可以点击桌面(Finder窗口中的选项仍在那里是正确的),然后直接在桌面上选择项目。当他返回我的应用程序时,它正确识别打开的窗口,但使用桌面上的项目作为选定的项目,这不是我想要的。我想做什么,我想要在最前面的窗口中选择的项目,但我不知道如何做到这一点。
任何线索?
代码1
- (void)applicationWillBecomeActive:(NSNotification *)notification {
[self psProgressWrapper:FALSE :_spinningWheel :spinningWheelText ] ;
NSUInteger *countArray = 0;
asResult = @""; //this variable holds the path to the folder the frontmost window belongs to
selectionFlag = FALSE; //reset
allFilesFlag = FALSE; //reset
//Get first finder window
FinderApplication * finder = [SBApplication applicationWithBundleIdentifier:@"com.apple.finder" ] ;
SBElementArray *windows = [finder FinderWindows ] ;
if([windows count] >0) {
FinderWindow *theWindow = [windows objectAtIndex:0 ] ;
asResult = [theWindow name ] ; //the name of the first window
//setting a texfield in the GUI to text and color green
[_errMessage setStringValue:asResult ] ;
[_errMessage setTextColor: myGreenColor ] ;
SBElementArray * selection = [[finder selection] get ] ;
countArray = [selection count ] ;
if(countArray == 0) {
atFilesOriginal = (NSMutableArray*) [self checkForSelection:asResult :TRUE ] ;
}
else if(countArray > 0) {
atFilesOriginal = (NSMutableArray*) [selection arrayByApplyingSelector:@selector(name) ] ;
}
else {
asResult = @"NoWin";
}
}
else {
asResult = @"NoWin";
[self checkFinderWindowType ] ;
}
[self refreshDRPopsWrapper] ;
[self psProgressFlag:TRUE Wheel:_spinningWheel Text:spinningWheelText];
[self goConvertBtnWrapper ] ;
[self checkFinderWindowType ] ;
}
答案 0 :(得分:-1)
我想做什么,我想要在最前面的窗口中选择的项目 但是我不明白我是怎么做到的。
问题是您偏离了既定的人机界面指南。您的用户在编写应用程序时将会非常困难地使用您的应用程序。
如果要选择文件/文件夹,请使用NSOpenPanel。
如果您不想要模态窗口,请支持从文件系统拖放。或者使用NSBrowser帮助他们浏览和选择应用程序窗口中的文件。
如果您真的想在Finder中操作,请创建一个Finder插件。