0

我在 dot-m 文件中有一个“decisionText”的标签代码,如下所示:

@synthesize decisionText ;  //<<<This generates the error 

在 dot-h 文件中,代码编写如下:

IBOutlet UILabel *decisionText 

我得到的错误是:没有在界面中找到属性“decisionText”的声明。

ps:在界面生成器中单击标签时,我可以在与文件所有者映射的引用出口下找到名称“decisionText”

坚持这一点。:(


正如建议的那样,我删除了@synthsize decisionText 行并使用了:

@property (nonatomic,weak) IBOutlet UILabel *decisionText ; 

现在我得到错误:在“弱”之前需要一个属性属性


点 M 文件:

#import "ClickButtonViewController.h"

@implementation ClickButtonViewController;



//@synthesize decisionText ; 
@property (weak,nonatomic) IBOutlet UILabel *decisionText ;

-(IBAction)buttonPressed:(id)sender 
{
    decisionText.text = @"Go for it!" ;
}

-(void)dealloc{
    [decisionText release];
    [super dealloc] ; 

}



- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}




@end
4

5 回答 5

1

在 .h 文件中添加:

@interface ViewController : UIViewController
{
     //....
     IBOutlet UILabel *decisionText ;
     //...
 }

@property (nonatomic, retain) IBOutlet UILabel *decisionText ;
//...
@end

然后在 .m 文件中添加:

@synthesize decisionText ; 
于 2012-09-21T11:41:28.070 回答
1

您使用声明属性@synthesize的语句。因此,您的代码应该如下所示:

@interface ViewController : UIViewController
{
    // your ivars go here

    // but this is not needed:
    //
    // IBOutlet UILabel *decisionText;
}

// your properties go here

@property (nonatomic, retain) IBOutlet UILabel *decisionText;

@end

如果您使用的是 ARC,请替换retainweak.

在您的 .m 文件中,您将拥有:

@implementation ViewController

@synthesize decisionText = _decisionText;

// and your implementation goes here

笔记:

  1. 虽然您可以显式声明您的实例变量,但如果您省略它,该@synthesize语句将为您创建一个。因此,您不需要显式声明任何实例变量。事实上,我可能会争辩说你不应该式声明你的实例变量,因为如果你有一个拼写错误,它只会提供一个机会,意外地得到两个实例变量,一个是你显式声明的,一个是编译器将生成的。我不止一次在 Stack Overflow 上看到过这个问题。因此,在我的示例中,我省略了显式的实例变量声明,我将让编译器为我处理它,并最大限度地减少出错的机会。

  2. 虽然不是必需的,但通常建议@synthesize语句为您的属性的实例变量指定一个不同的名称(例如,在这种情况下,我建议该属性decisionText将具有一个实例变量_decisionText)。这有助于防止在您打算调用属性的 getter 或 setter 时意外引用实例变量。(事实上​​,在 Xcode 4.4 及更高版本中,如果您省略该@synthesize语句,编译器将自动为您合成带有前导下划线的实例变量。)因此,在您的代码中,您将引用属性self.decisionText或实例变量_decisionText. 它通常对IBOutlet对象不是那么重要,但是当您开始使用自己的自定义属性时,这种约定就变得有用了。

于 2012-09-21T11:37:38.937 回答
0

改变

IBOutlet UILabel *decisionText 

@property (nonatomic, weak) IBOutlet UILabel *decisionText 

您只能使用 @property 关键字合成您定义的属性

于 2012-09-21T11:36:54.513 回答
0

或者,如果您使用的是 Xcode 4.4,您可以使用自动合成。

在这种情况下,您不需要声明 iVar,您只需编写:

@property (weak, nonatomic) IBOutlet UILabel *decisionText;

而且您根本不需要编写@sythesize 行。

如果您这样做 - 请注意,默认情况下生成的 iVar 将附加一个前导下划线,尽管在这种情况下您应该坚持使用属性访问器,所以它几乎没有什么区别。

您可以在Objective-C 功能可用性索引中查看您可以执行的操作

于 2012-09-21T11:39:32.607 回答
0

您只声明了将存储属性内容的实例变量,但您没有声明属性本身。我认为解决这个问题的最简单方法是在公共接口(.h 文件)或私有接口(@interface ClassName () ... @end in ClassName.m 文件)中添加属性声明。

类名.h

@interface ClassName : ParentClass
@property (nonatomic, weak) IBOutlet UILabel decisionText; //This is the declaration of the property than you can ctrl-drag to wire it up to your label
@end

类名.m

@implementation ClassName

@synthesize decisionText = _decisionText //the _decisionText stuff is the name of the instance variable that will store the content of your property

... //your methods

@end
于 2012-09-21T11:53:09.943 回答