Objective c 默认情况下,当子视图';s superview已加载,但仍有访问权限?

Objective c 默认情况下,当子视图';s superview已加载,但仍有访问权限?,objective-c,cocoa-touch,uiview,ios7,uitextfield,Objective C,Cocoa Touch,Uiview,Ios7,Uitextfield,我有一个显示UILabel和UIExtField子视图以及UIImageView和2个UIButton的视图。这些都构成了一个表格。其中一个字段专用于dd/mm//yyyy格式的日期输入 我决定在主视图中创建另一个视图(称为datePickerView),该视图包含一个UIDatePicker实例。单击上述表单上的日期字段时,将显示带有日期选择器的视图。单击“完成”按钮后,视图将再次隐藏/删除 我有一些方法可以处理此视图的显示和隐藏: @property (weak, nonatomic) IB

我有一个显示UILabel和UIExtField子视图以及UIImageView和2个UIButton的视图。这些都构成了一个表格。其中一个字段专用于dd/mm//yyyy格式的日期输入

我决定在主视图中创建另一个视图(称为datePickerView),该视图包含一个UIDatePicker实例。单击上述表单上的日期字段时,将显示带有日期选择器的视图。单击“完成”按钮后,视图将再次隐藏/删除

我有一些方法可以处理此视图的显示和隐藏:

@property (weak, nonatomic) IBOutlet UIView *datePickerView;
- (void) hidePickerView {
    [UIView animateWithDuration:0.5
                     animations:^{
                         [[self datePickerView] setFrame:CGRectMake(0, -250, 320, 50)];
                     } completion:^(BOOL finished) {
                         [[self datePickerView] removeFromSuperview];
                     }];
}

- (void) showPickerView {
    [[self view] addSubview:[self datePickerView]];
    [[self datePickerView] setFrame: CGRectMake(0, -250, 320, 50)];
    [UIView animateWithDuration:1.0
                     animations:^{
                         [[self datePickerView] setFrame: CGRectMake(0, 152, 320, 260)];
                     }];
}
我在
textfielddendediting
textfield应该开始编辑
UITextField委托方法中调用这些方法

我的问题是,带有日期选择器的视图在第一次加载superview时是可见的。我尝试将这个datepicker视图拖到所有文本字段和按钮上方的层次结构顶部,但这只会将视图移到它们后面

我还尝试过通过故事板界面隐藏视图,尝试过向viewDidLoad、ViewWillDisplay添加隐藏方法。我测试的方法是:

[self datePickerView] removeFromSuperview];
[[self datePickerView] setHidden:YES];
[self hidePickerView];
这些隐藏datePickerView没有问题,但是当我单击文本字段时,datePickerView不会显示

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    // missing since date field error checking
    if (textField == [self missingSinceField]) {
        [self showPickerView];
        return NO;
    }
    return YES;

}


-(void)textFieldDidEndEditing:(UITextField *)textField {

    if (textField == [self missingSinceField]) {
        [self hidePickerView];
    }
}
当我不以任何方式隐藏或删除datePickerView形状或表单并点击它时,datePickerView加载没有问题

**在发布这个问题之前,我在showDatePicker方法中设置了一个断点,当我取消注释
[self-datePickerView]removeFromSuperview]时我看到我的datePickerView门店为零,因此这可以解释为什么我会遇到问题。再次对其进行注释并再次尝试显示它不是零

我认为这就是问题所在,但不确定如何确保在运行viewDidLoad时我的datePickerView不是零。我不能让它显示在文本字段下的表单背景中,我不认为将其颜色更改为白色以便用户看不到它是不优雅的

我们将不胜感激


亲切问候

我猜您的
datePickerView
的IBOutlet属性是
弱的
,因此,当您从superview中删除它时,它会被销毁


将其设置为
strong
,或者改用
hidden
属性(请记住在
showPickerView
中将
hidde
设置为
NO
,在
hidePickerView
中设置为
YES
,您当前在其中添加和删除视图).

您可能希望使用正在使用的UIView子类的hidden属性

来源:


只要您的出口为nil,请确保您已将IBOutlet连接到情节提要中的实际元素。

这起作用,我将创建一个新操作,该操作连接到datepicker页面上的“完成”按钮,代码与hidePickerView类似。事情是第二次了,它似乎不起作用。它加载了date picker视图,但现在看起来像是在后台。是的,我正在使用setHidden,还将datepickerview设置为strong。我试着把Subview带到前面,但没什么区别。Datepickerview永远不会回到前台。我在hidePickerView方法中已从SuperView移除。非常粗心。今天做了好几次,匆忙地,没有一行一行地,彻底地阅读我的代码。