这个错误意味着什么:在界面中找不到属性'decisionText'的声明

时间:2012-09-21 11:32:27

标签: ios

我在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 ; 

现在我收到错误: 在“弱”之前预期属性属性


Dot 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

5 个答案:

答案 0 :(得分:1)

您将@synthesize语句与declared properties一起使用。因此,您的代码可能应该如下所示:

@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,请将retain替换为weak

在您的.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个对象不那么重要,但是当您开始使用自己的自定义属性时,此约定会变得有用。

答案 1 :(得分:1)

<。>在.h文件中添加:

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

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

然后在.m文件中添加:

@synthesize decisionText ; 

答案 2 :(得分:0)

更改

IBOutlet UILabel *decisionText 

@property (nonatomic, weak) IBOutlet UILabel *decisionText 

您只能使用@property关键字

合成您定义的属性

答案 3 :(得分:0)

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

在这种情况下,你不需要声明你可以写的iVar:

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

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

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

您可以在Objective-C Features Availability Index

中查看可以执行的操作

答案 4 :(得分:0)

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

ClassName.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

ClassName.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