0

好的,下面是创建日期选择器的标准示例

- (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);
}

和这个?如果我知道我的视图只包含某种对象,我是否需要一直检查课程?

for((id) myLabel in view.subviews){
    if([myLabel isKindOfClass:[UILabel class]){
        UILabel *theLabel = myLabel;
        NSLog(myLabel.text);
    }
}
4

3 回答 3

1

通常,如果您需要多次访问它们,您只需定义属性。您可以在 .m 文件的界面中执行此操作:

@interface MyObject()

@property (weak, nonatomic) UIDatePicker *myPicker;

@end

然后,您将能够通过 _myPicker 或 self.myPicker 访问它。

你不应该在你的类中需要另一个 NSDate 属性,因为你可以随时访问设置的日期:

_myPicker.date

对于您的最后一个问题:两者中的后者只是额外的健全性检查。当您编写自己的代码时,您应该知道要添加哪些子视图,仔细检查子视图的类型不会有什么坏处,以防万一出现任何问题并且您尝试访问不存在的选择器. 这是一个更大的编程问题,不一定是特定于 Objective-c 或 iOS 的。

于 2013-07-24T16:18:22.643 回答
0

根据您的示例,记录的方法是拦截UIControlEventValueChanged事件。

然后,您通常会将[sender date]值复制到方法中的属性中pickerChanged:

如果用户点击保存按钮,那么呈现包含选择器的视图的对象应该能够通过属性检索选定的日期。

使用 isKindOfClass: 不是很好的做法。你应该构造你的代码,这样你总是知道你正在处理什么类。

此外,您应该真正切换到 ARC,这样您就不必担心调用release

于 2013-07-24T16:19:20.550 回答
0

您需要声明一个UIDatePicker属性来保存您的子控制器的一个实例

这是您需要在.h文件中添加的内容:

@property (strong, nonatomic) UIDatePicker *myPicker;

然后在您的.m文件中,您需要为此日期选择器添加数据源方法。类似于rdelmar上面的指示:

self.myPicker = [[UIDatePicker alloc] init];
于 2013-07-24T16:28:57.727 回答