下面是创建日期选择器的标准示例
- (void)viewDidLoad {
CGRect pickerFrame = CGRectMake(0,250,100,100);
UIDatePicker *myPicker = [[UIDatePicker alloc] initWithFrame:pickerFrame];
[myPicker addTarget:self action:@selector(pickerChanged:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:myPicker];
[myPicker release];
}
- (void)pickerChanged:(id)sender
{
NSLog(@"value: %@",[sender date]);
}
这一切都很好。我有点习惯在 IB 中创建元素,因此当我以编程方式创建对象时,我不确定如何访问数据。
我的意思是..我应该将 myPicker 分配给类属性,然后将其作为 _myPicker 访问吗?
或者假设我想访问 pickerChanged 方法内部的日期而不调用其他方法。我应该分配一个 NSDate 属性并在每次选择器更改时重新分配它吗?
当我尝试这样做时遇到了一些内存问题。我有另一种方法获取 _theDate,它可能尝试在 pickerChanged 修改它的同时访问它?
无论如何,我得到的是“以编程方式创建操作表和选择器等内容时正确的工作流程是什么”。当这些事情发生变化时,应该如何保存结果数据以便类的其余部分可以访问它?
额外问题:
这有区别吗?
for(UILabel *myLabel in view.subviews){
NSLog(myLabel.text);
}
还有这个?如果我知道我的 View 只包含某种类型的对象,我是否需要一直检查该类?
for((id) myLabel in view.subviews){
if([myLabel isKindOfClass:[UILabel class]){
UILabel *theLabel = myLabel;
NSLog(myLabel.text);
}
}
最佳答案
通常,如果您需要多次访问属性,则只需定义它们即可。您可以在 .m 文件的界面中执行此操作:
@interface MyObject()
@property (weak, nonatomic) UIDatePicker *myPicker;
@end
然后您将能够通过 _myPicker 或 self.myPicker 访问它。
您的类中不需要另一个 NSDate 属性,因为您可以随时访问设置的日期:
_myPicker.date
对于你的最后一个问题:两者中的后者只是额外的健全性检查。当您编写自己的代码时,您应该知道要添加哪些 subview ,仔细检查 subview 的类型不会有什么坏处,以防出现任何问题并且您尝试访问不存在的选择器。但这是一个更大的编程问题,不一定是 Objective-C 或 iOS 特定的。
关于iOS SDK : about using properties when creating objects programmatically?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17839161/