【问题标题】:How can I hide/remove a subview by default when it's superview loaded but still have access to it?加载超级视图但仍然可以访问它时,如何默认隐藏/删除子视图?
【发布时间】:2014-02-18 13:26:03
【问题描述】:

我有一个显示 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 委托方法中调用这些方法。

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

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

[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 出口为零,所以这可以解释我遇到问题的原因。再次评论它并再次尝试显示它不是 nil。

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

我们将不胜感激。

亲切的问候

【问题讨论】:

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


    【解决方案1】:

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

    要么设为strong,要么改用hidden 属性(记住将showPickerView 中的hidden 设置为NOhidePickerView 中的YES - 您当前添加和删除视图的位置)。

    【讨论】:

    • 这行得通,我创建了一个新操作,该操作连接到日期选择器页面上的“完成”按钮,其代码与 hidePickerView 类似。问题是第二轮它似乎不起作用。它加载了日期选择器视图,但现在看起来像是在后台。
    • 是的,我正在使用 setHidden 并且还将 datepickerview 设置为强。我试过bringsubviewtofront,它没有任何区别。 Datepickerview 永远不会回到前面。
    • 已排序。我的 hidePickerView 方法中有 removeFromSuperview 。很不小心。今天做了好几次,匆忙而不是逐行阅读我的代码。
    【解决方案2】:

    您可能想要使用您正在使用的 UIView 子类的 hidden 属性。

    来源: UIView reference

    至于您的插座 nil - 确保您已将 IBOutlet 连接到情节提要中的实际元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多