2012-12-12 100 views
1

我想用这些代码行从该source客观C宏

#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) 

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

回答

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风格的功能,将它列入你的应用程序当它被编译/链接。但是,由于它是#define d,这意味着在编译之前编译器会首先将其更改为do-while

你会这样称呼它:

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

作为一个额外的信息,#define通常用于定义常量,是这样的:

#define PI_VALUE 3.141592 

这将对被称为是这样的:

double circumference = 2 * PI_VALUE * radius; 

但是正如在宏观中看到的,它也可以看/ sed作为一项功能。因此,您必须考虑宏/ #define如何确保您正确调用它。

+0

谢谢neilvillareal! –