默认情况下,当加载超级视图但仍可访问子视图时,如何隐藏/删除子视图?

时间:2014-02-18 13:26:04

标签: objective-c cocoa-touch uiview ios7 uitextfield

我有一个显示UILabel和UITextField子视图以及UIImageView和2个UIButtons的视图。这些都构成了一种形式。其中一个字段专用于以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)];
                     }];
}

我在textFieldDidEndEditingtextFieldShouldBeginEditing UITextField委托方法中调用这些方法。

我的问题是,当首次加载superview时,datepicker的视图是可见的。我尝试将此datepicker视图拖动到所有文本字段和按钮上方的层次结构顶部,但这只会移动它们后面的视图。

我也尝试通过storyboard界面隐藏视图,尝试向viewDidLoad,viewWillAppear添加一个hide方法。我测试的方法是:

[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不是nil。我不能在文本字段下的表单背景中显示它,我不认为它的颜色变为白色,所以用户看不到它不优雅。

帮助将不胜感激。

亲切的问候

2 个答案:

答案 0 :(得分:1)

我猜您datePickerView的IBOutlet属性为weak,因此,当您从超级视图中删除它时,它会被销毁。

要么设置strong,要么使用hidden属性(记得在hiddenNO中设置showPickerViewYES hidePickerView - 您当前添加和删除视图的位置。)

答案 1 :(得分:1)

您可能希望使用正在使用的UIView子类的隐藏属性。

<强>来源: UIView reference

至于您的商店 nil - 请确保您已将IBOutlet连接到故事板中的实际元素。