1

我想使用这个来源的这些代码行

#define TEXTVIEW_SET_HTML_TEXT(__textView__, __text__)\
do\
{\
    if ([__textView__ respondsToSelector: NSSelectorFromString(@"setContentToHTMLString:")])\
        [__textView__ performSelector: NSSelectorFromString(@"setContentToHTMLString:") withObject: __text__];\
    else\
        __textView__.text = __text__;\
}\
while (0)

#define TEXTVIEW_GET_HTML_TEXT(__textView__, __text__)\
do\
{\
    if ([__textView__ respondsToSelector: NSSelectorFromString(@"contentAsHTMLString")])\
        __text__ = [__textView__ performSelector: NSSelectorFromString(@"contentAsHTMLString") withObject: nil];\
    else\
        __text__ = __textView__.text;\
}\
while (0)

我该怎么办?我是宏的新手。我应该用名称定义一个 uitextview 变量__textView__吗?是否可以帮助我完成一些基本步骤以使用此代码?

4

1 回答 1

3

您只需要将宏放在 之外@implementation,如下所示:

#import "..."

// Put the macros here

// This block may or may not be present in your code...
@interface YourClass ()

@end
// ... up to here.

@implementation YourClass

@end

您不必声明变量,因为它们已在宏中声明。你可以这样想:

#define TEXTVIEW_SET_HTML_TEXT(__textView__, __text__)\
do\
{\
    if ([__textView__ respondsToSelector: NSSelectorFromString(@"setContentToHTMLString:")])\
        [__textView__ performSelector: NSSelectorFromString(@"setContentToHTMLString:") withObject: __text__];\
    else\
        __textView__.text = __text__;\
}\
while (0)

作为这个 C 风格的函数:

void TEXTVIEW_SET_HTML_TEXT(UITextView *__textView__, NSString *__text__)
{
    do
    {
        if ([__textView__ respondsToSelector: NSSelectorFromString(@"setContentToHTMLString:")])
            [__textView__ performSelector: NSSelectorFromString(@"setContentToHTMLString:") withObject: __text__];
        else
            __textView__.text = __text__;
    }
    while (0);
}

不同之处在于,如果您已将其声明为 C 样式函数,则它会在编译/链接时包含在您的应用程序中。但是,由于它是#defined,这意味着编译器将首先将其更改为do-while编译前。

你可以这样称呼它:

- (void)yourMethodThatWillChangeTheText
{
    // ...
    TEXTVIEW_SET_HTML_TEXT(self.myTextView, @"Hello");
    // ...
}

作为附加信息,#define通常用于定义常量,例如:

#define PI_VALUE 3.141592

这将不得不被称为:

double circumference = 2 * PI_VALUE * radius;

但正如在宏中看到的那样,它也可以看起来/被用作一个函数。因此,您必须考虑宏 / 的#define外观以确保正确调用它。

于 2012-12-12T07:33:36.523 回答