21

在 Xcode 4.0 版中,我注意到方法中的#pragma 标记不再显示在跳转栏中。唯一出现的#pragma 标记是方法之间的标记。

我正在使用这些#pragma 标记来轻松快速组织和获取出现在我的表格视图的不同部分中的信息,我真的很想恢复该功能。

有谁知道如何让他们再次出现?

4

13 回答 13

19

我也遇到了这个问题。在第一种方法之前添加的编译指示将不会显示。例如,这将不起作用:

@implementation RandomClass

#pragma mark - Getter Methods

- (void) firstMethod
{
}

@end

以下是一些快速解决方法,可在第一种方法出现之前制作杂注标记。您可以在它之前添加一个空块,或者您可以将 pragma 标记放在块本身内。

使用空块:

@implementation RandomClass
{}
#pragma mark - Getter Methods

- (void) firstMethod
{
}

@end

在空块本身内添加编译指示:

@implementation RandomClass
{
#pragma mark - Getter Methods
}

- (void) firstMethod
{
}

@end

它看起来不太漂亮,但它确实有效。我希望这会有所帮助。

于 2012-11-19T11:50:12.900 回答
8

我在使用用于 xcode 3.x 并且不再适用于 xcode 4 的语法时遇到了这个问题。

我只使用“pragma”

#pragma - My Pragma Text

这在 xcode 3 中可以正常工作,但对于 xcode 4,必须使用完整的语法。这意味着#pragma 必须始终后跟“mark”关键字。

#pragma mark - My Pragma Text

编辑

Xcode 6(在 beta 4 中修复)使用文件// MARK:语法swift

于 2011-04-24T02:27:37.137 回答
2

#pragma 标记是否在以前的 xcode 中的方法内部工作?我真的很想使用它们,但就像你说的那样,它只适用于方法之间而不是方法内,这将非常有用。

如果有人对在将代码添加到 XCode 跳转栏的方法中添加代码的方法有任何想法...

于 2011-05-15T16:07:51.640 回答
2

对于它的价值,我已经提交了一份错误报告 (12895229),因为我找不到已提交的文件。

感谢您提供解决方法。分配给宏允许将来轻松删除:

#define WORK_AROUND_PRAGMA {}

我倾向于使用全局宏文件来处理此类有用的事情。你知道,快速编码/解码、访问器(在属性之前的日子)等等。

于 2012-12-17T21:11:35.473 回答
2
@implementation ViewController

- (void)pragmaStartHack {} // Since pragma only works when after at least one method

#pragma mark This pragma will render in Xcode

// Your code here...

@end
于 2013-06-11T18:37:29.927 回答
2

我遇到了同样的问题。@implementation ...我现在在第一个“真实”方法之后和之前插入一个虚拟方法。我在项目文件中定义了这个方法,...-Prefic.pch所以它不会出现在跳转栏中。

将以下内容添加到您的 ...-Prefix.pch:

#define PLEASE_LET_PRAGMA_MARK_WORK - (void) pleaseLetPragmaMarkWork {}

并在您的补充中插入请求:

@implementation anyClass

PLEASE_LET_PRAGMA_MARK_WORK

#pragma mark - This will show up.

奇迹般有效。

于 2013-02-02T10:52:38.230 回答
2

显然 Xcode 中的编译指示解析器存在一些问题。在我的情况下,我可以#pragma通过将它们的语法统一到新的来使 s 重新出现。

而不是在其中包含一些杂注的不统一和混乱的代码块:

// Code ...
#pragma mark -
#pragma mark UITextViewDelegate Protocol

// More code ...
# pragma mark - Important stuff
// Even more code ...

我将所有内容更改为:

// Code ...

#pragma mark - UITextViewDelegate Protocol

// More code ...

# pragma mark - Important stuff

// Even more code ...

基本上,我确定...

  • 行前后各有一个空#pragma
  • 前面只有一个空格,后面只有一个空格-
  • pragma 行不空格结尾。

更新

我已经意识到,如果项目在某处被破坏,有时上述规则是不够的。(我尝试将一些资源移动到一个新项目并且它们正确显示)。所以我所做的是关闭我的项目,从组织者中删除其派生数据,并删除这两个文件夹

MyProject.xcodeproj/project.xcworkspace/
MyProject.xcodeproj/xcuserdata/

所以下次我打开我的项目时,Xcode 会重新生成它们:)

现在我所有的消息来源都好了:)

于 2012-08-15T11:44:38.347 回答
2

我意识到我要说的可能适用于一小部分用途,但以防万一......

如果您使用 Doxygen 从您的源代码注释生成文档,并且您倾向于在实现文件(即 .m)中注释您的方法,那么在 @implementation 之后添加一个空白部分将导致 Doxygen 无法解析您的 Doxygen 注释。

于 2013-06-06T16:34:34.337 回答
2

显然,在您使用第一种方法之前,它们不会起作用。例如,这将不起作用:

#import "Person.h"

@implementation Person

#pragma mark - Convenience

// ===========================================================
//           Class/Convenience Methods
// ===========================================================

+ (Person *)personWithName:(NSString *)name hourlyRate:(double)rate
{
    Person *person = [[[Person alloc] initWithName:name rate:rate] autorelease];
    return person;
}

如果我错了,请告诉我,但我不认为我错了。如果这应该工作,我希望它得到修复!

于 2012-10-23T21:25:29.933 回答
2

对于方法中的标记(或其他任何地方),您现在可以使用关键字TODO:作为注释。

像这样:

// TODO: some text

我不确定这个可用的 xcode 版本(可能是 4.5+),但它在最新版本中可用。

在此处输入图像描述

于 2012-11-14T23:28:02.840 回答
1

为了澄清 RantriX 的正确答案……</p>

如果您的第一个#pragma mark未能出现在跳转栏的上下文菜单中,请添加一对大括号。(Xcode 版本 4)

例如,改变这个:

@implementation MainMenu

#pragma mark Lifecycle

对此(注意花括号):

@implementation MainMenu
{

}

#pragma mark Lifecycle
于 2013-05-21T21:13:05.843 回答
1

user1639164 - 冒着迂腐的风险,我会说你是“95%”的正确。我发现可以让 Xcode在您的第一个方法之前显示一个编译指示。如果源文件中的第一段代码恰好是常规过程而不是方法,那么您将看到编译指示。例如

NSString * localizedString (NSString * key)
{
// My code here…
}

# pragma mark - app-delegate startup

- (id) init
{
  self = [super init];
  if (self)… etc

这是我的样板应用程序委托代码的摘录。在这种情况下,您看到编译指示出现在第一种方法之前。但不是在你的第一块代码之前!:-) 因此,就好像编译指示解析机器在看到至少一个例程(方法或其他方法)之前无法启动它。正如你所说,希望它尽快修复。

于 2012-10-30T23:19:32.313 回答
0

要在 Jump Bar 中显示 pragma 标记,请尝试以下操作:

  1. 只需删除 ' //MARK ' 和 ' : ' 之间的空格。
  2. 那应该是这样的'//MARK:'。
于 2018-07-13T08:25:30.120 回答