我是iPhone编程的新手,我有一个非常基本的问题,这让我很困惑。我在我的头文件中声明了一个公共的UIScrollView。
@property UIScrollView *scroller;
然后在我的实现文件中我合成它;
@synthesize scroller;
并在
- (id)initWithFrame:(CGRect)frame
方法我分配我的对象。
if (self) {
scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(23, 99, 280, 300)];
}
(该课程从UIView扩展)
但是当我尝试在方法中访问此属性时,我总是得到nil值,这是没有意义的。
- (void)DeselectAll{
scroller.hidden = YES;
}
(滚动条总是在这里返回nil。)
我也尝试使用self.scroller访问它,但值仍为零。我确信我错过了一个非常简单的观点但却无法理解。
(顺便说一下,我的所有公共财产都出现了这个问题)
非常感谢任何帮助。
谢谢。
答案 0 :(得分:0)
首先,声明属性如下
@property(strong,nonatomic) UIScrollView *scroller;
现在你初始化为
if (self) {
self.scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(23, 99, 280, 300)];
}
答案 1 :(得分:0)
在头文件中创建UIScrollView
,如下所示:
@interface MyViewController : UIViewController {
UIScrollView * scrollView;
}
@property (nonatomic, retain) IBOutlet UIScrollView * scrollView;
@end
然后在viewDidLoad
中初始化它:
@synthesize scrollView;
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView = [[UIScrollView alloc]init(WithFrame:)];
[self.scrollView addSubview:...];
self.scrollView.contentSize = ...;
}
答案 2 :(得分:0)
如果您使用ARC,我认为这些属性已经发布。 只需在申报时使用强大的财产。
@property(strong, nonatomic)UIScrollView *scroller;
答案 3 :(得分:0)
您是否检查过正在调用initWithFrame:
?
如果要在NIB文件中创建UIView
子类,则不会调用该方法,而是调用initWithCoder:
。
答案 4 :(得分:0)
雅你有正确的。但是你错过了对财产的内存管理。看看this。
例如,如果您需要保留创建的对象。你应该这样做。
对于ARC,
@property(strong,nonatomic) UIScrollView *scroller;
withur ARc
@property(retain,nonatomic) UIScrollView *scroller;
更新:
您必须使用self
进行分配。否则,它不会通过setter方法设置。如下所示
if (self) {
self.scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(23, 99, 280, 300)];
}
答案 5 :(得分:0)
好的,这就是我如何解决这个问题。我在我的nib文件中创建了这些控件,并将变量指定为这些对象的出口。在这种情况下,对象将被保留,我可以从我的方法中访问它们。 (我尝试将变量定义为IBOutlets而不分配给nib文件中的控件,在这种情况下,值再次返回为nil。只有在我将它们链接到控件之后,才保留对象。)虽然我解决了这个问题但我遇到了困难理解这种行为。我尝试了答案中推荐的所有内容,但奇怪的是,我的方法中的对象仍然是nil。
感谢所有花时间撰写回复问题的人。也许有人可以解释并帮助我理解这种奇怪的行为?
干杯。