我是objetive-c的新手,因为我来自Java(Android),然后是AppleScript。
所以我的应用程序正在进行 git 提交。但如您所知,终端具有用户可能希望看到的输出。所以我应该继续使用我的NSTask进行幕后工作,还是应该只使用AppleScript并让用户从终端继续。主要是我的 push.m 看起来像这样:
#import "Push.h"
@implementation Push
@synthesize test;
@synthesize dirPath;
-(IBAction)chooseFolder:(id)sender{
dirPath = [self get];
NSArray *array = [dirPath componentsSeparatedByString:@"/"];
NSString *pub = [array lastObject];
[projectName setStringValue:pub];
BOOL fileyn = [self check:dirPath];
if(fileyn) {
} else {
}
}
-(IBAction)pushAction:(id)sender {
[self push];
[self push];
}
-(void)push{
if(dirPath == nil || dirPath == @"") {
[self chooseFolder:nil];
}
NSString *commitText = [commitMessage stringValue];
[commitMessage setStringValue:@""];
commitText = [NSString stringWithFormat:@"%@",commitText];
if (i == 1) {
} else {
[self runScript:dirPath:@"add" :@"*" :nil];
[self runScript:dirPath:@"commit" :@"-m" :commitText];
[self runScript:dirPath:@"push" :@"origin" :@"HEAD"];
}
}
-(void) runScript:(NSString *) path:(NSString* )cmd1:(NSString *) cmd2:(NSString *) cmd3{
NSTask *aTask = [[NSTask alloc] init];
NSPipe *pipe;
pipe = [NSPipe pipe];
[aTask setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
NSArray* args = [NSArray arrayWithObjects:cmd1,cmd2,cmd3, nil];
[aTask setArguments:args];
[aTask setCurrentDirectoryPath:path];
[aTask setLaunchPath:@"/usr/local/git/bin/git"];
[aTask setArguments:args];
[aTask launch];
[finished setStringValue:@"finished"];
}
-(IBAction)back:(id)sender{
test = [[NSWindowController alloc] initWithWindowNibName:@"POP"];
[test showWindow:self];
[window close];
}
-(BOOL)check:(NSString *) pow{
BOOL isFile = [[NSFileManager defaultManager] fileExistsAtPath:pow isDirectory:NO];
return isFile;
}
-(NSString *)get {
NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel setAllowsMultipleSelection:NO];
[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:NO];
if ([panel runModal] != NSFileHandlingPanelOKButton) return nil;
return [[panel directoryURL] path];
}
@end
那我该怎么办?有什么需要改进的吗?提前感谢!
这种应用程序设计实际上取决于你;这里没有正确的答案。这取决于您要完成的操作,以及您希望允许用户执行的操作。如果只想向用户显示正在运行的任何命令的输出,只需从NSTask
中获取输出(使用设置的输出管道),并将其显示在文本视图中供用户查看。
但是,如果要运行交互式git
命令,则会变得有点复杂。我在这里四处走动,因为您的问题对"让用户从终端继续"的含义不是很具体,所以如果这不是您的意思,请告诉我。就良好的用户界面和用户体验而言,除非您别无选择,否则强迫某人转到其他应用程序以继续使用您自己的应用程序几乎从来都不是一个好主意。如果应用想要向用户显示结果,最好在应用内执行此操作(例如,使用自定义视图或 Web 视图),而不是将用户带到其他地方。如果您希望命令是交互式的,那么更好的设计是提供一个界面来处理您的应用程序中的命令,而不是运行AppleScript并将用户定向到终端以查看和执行操作。
浏览一下,您的代码似乎应该可以工作(除了注释中提到的问题,您应该修复这些问题)——而且由于您没有提到它的任何问题,我认为它确实如此。这不是编程问题;这是一个设计问题,你必须自己考虑它的答案(话虽如此,我投票结束这个问题,因为它并不真正符合 StackOverflow 指南——答案是一个意见问题,而不是事实)。