我在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
答案 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
注意:
虽然您可以显式声明您的实例变量,但如果省略它,@synthesize
语句将为您创建一个。因此,您不需要显式声明任何实例变量。事实上,我可能会争辩说你应该不显式地声明你的实例变量,因为如果你有一个拼写错误,它只会提供一个偶然结束两个实例变量的机会,你明确声明的变量和编译器将生成一个。我已经在Stack Overflow上看到了这个问题不止一次。所以,在我的例子中,我省略了显式的实例变量声明,我将让编译器为我处理它,并最大限度地减少出错的可能性。
虽然不是必需的,但通常建议@synthesize
语句为您的属性的实例变量指定一个不同的名称(例如,在这种情况下,我建议属性decisionText
将有一个_decisionText
的实例变量。当您打算调用属性的getter或setter时,这有助于阻止意外引用实例变量。 (事实上,在Xcode 4.4及更高版本中,如果省略@synthesize
语句,编译器将自动为您使用前导下划线合成实例变量。)因此,在您的代码中,您将引用属性self.decisionText
或实例变量_decisionText
。它通常对IBOutlet
个对象不那么重要,但是当您开始使用自己的自定义属性时,此约定会变得有用。
答案 1 :(得分:1)
@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会附加一个前导下划线,尽管在这种情况下你应该坚持使用属性访问器,所以它没什么区别。
中查看可以执行的操作答案 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