我有一个OSX应用程序,可以创建Objective-C代码。换句话说,写入两个文件,.h和.m。
要写入文件,我使用NSString writeToFile atomically true,编码NSUTF8StringEncoding。
尽管我的两个文件是使用正确的文本创建的,但所有格式都会丢失。即使导入Xcode,一切都会向左对齐。虽然我知道我可以选择文本并使用ctrl + i缩进它,但这不是我想要的解决方案。
现在,当我将NSString复制到剪贴板并将其粘贴到Xcode中时,格式化将保持原样。
有没有人知道我可以像Xcode那样保持文本缩进的方式,而不必编写有关打开多少花括号的规则?这是我到目前为止所做的一些修改示例代码:
NSString *code = @"for (int i = 0; i < 10; i++) {\n";
code = [code stringByAppendingString:@"NSLog(@\"HelloWorld\");\n"];
code = [code stringByAppendingString:@"}\n"];
// If I run the two lines below, then my NSString is copied to the clipboard. When I paste into Xcode, formatting stays as it should.
[[NSPasteboard generalPasteboard] clearContents];
[[NSPasteboard generalPasteboard] setString:code forType:NSStringPboardType];
// If I run the code below instead, then two files are created. But they do not keep the formatting.
NSSavePanel *panel = [NSSavePanel savePanel];
[panel setNameFieldStringValue:@"MyClass"];
[panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if (result == NSFileHandlingPanelOKButton) {
NSError *errorH = nil;
NSError *errorM = nil;
NSString *pathH = [[[panel URL] path] stringByAppendingString:@".h"];
NSString *pathM = [[[panel URL] path] stringByAppendingString:@".m"];
[code writeToFile:pathH atomically:true encoding:NSUTF8StringEncoding error:&errorH];
[code writeToFile:pathM atomically:true encoding:NSUTF8StringEncoding error:&errorM];
if (!errorH && !errorM) {
NSLog(@"Success");
} else {
NSLog(@"Error Saving Files");
}
}
}];
编辑:在没有明确的方法来优雅地做到这一点之后,我只需编写一些自己的格式代码来模仿Xcode完成的格式化。它不能100%正常工作...例如,当我使用:向数组添加多个项目时
@[@"string1",
@"string2",
@"string3"];\n
这不会保持正确缩进到数组开始的位置。我确信还有其他情况我的代码无法处理。虽然不是很大的交易。如果以后想到解决方案,我可以实现它。但就目前而言,格式化不会像预期的那样漂亮。这是一个方法和一个帮助方法,任何人都可以使用它来实现类似的功能(仅处理标签和花括号)
- (NSString *) formatWithIdentationForExport : (NSString *) theString {
NSString *s = @"";
NSMutableArray *fileLines = [[NSMutableArray alloc] initWithArray:[theString componentsSeparatedByString:@"\n"] copyItems: YES];
int numberOfCurlyBraces = 0;
for (int i = 0; i < fileLines.count; i++) {
NSString *currentLine = fileLines[i];
int numberOfOpenBracesInLine = [self getNumberOfOccurancesOf:@"{" inString:currentLine];
int numberOfCloseBracesInLine = [self getNumberOfOccurancesOf:@"}" inString:currentLine];
numberOfCurlyBraces -= numberOfCloseBracesInLine;
for (int j = 0; j < numberOfCurlyBraces; j++) {
currentLine = [NSString stringWithFormat:@"\t%@", currentLine];
}
currentLine = [currentLine stringByAppendingString:@"\n"];
s = [s stringByAppendingString:currentLine];
numberOfCurlyBraces += numberOfOpenBracesInLine;
}
return s;
}
- (int) getNumberOfOccurancesOf : (NSString *) substring inString : (NSString *) str {
int count = 0, length = (int)[str length];
NSRange range = NSMakeRange(0, length);
while(range.location != NSNotFound) {
range = [str rangeOfString:substring options:0 range:range];
if(range.location != NSNotFound) {
range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
count++;
}
}
return count;
}
答案 0 :(得分:1)
生成ObjC代码时,应手动添加缩进(制表符或空格),否则不会将其保存到文件中。
答案 1 :(得分:1)
使用“\ t”作为缩进。我不会为你的代码的每一行做这件事,而是做类似
的事情[[NSMutableString alloc] initWithString:@"for (int i = 0; i < 10; i++) {\n"];
[codeStr appendString:@"\t"];[codeStr appendString:@"NSLog(@\"center\");"];