NSString writeToFile丢失缩进

时间:2016-05-31 18:38:13

标签: objective-c xcode macos

我有一个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;
}

2 个答案:

答案 0 :(得分:1)

生成ObjC代码时,应手动添加缩进(制表符或空格),否则不会将其保存到文件中。

答案 1 :(得分:1)

使用“\ t”作为缩进。我不会为你的代码的每一行做这件事,而是做类似

的事情
[[NSMutableString alloc] initWithString:@"for (int i = 0; i < 10; i++) {\n"];
[codeStr appendString:@"\t"];[codeStr appendString:@"NSLog(@\"center\");"];