【问题标题】:show subview when UITextField touched触摸 UITextField 时显示子视图
【发布时间】:2011-09-26 18:47:03
【问题描述】:

我对 iPhone 开发还很陌生,所以请原谅我的无知。我用谷歌搜索了一下,到目前为止没有任何用处。这是我想做的:

我希望在触摸 UITextField 时弹出一个子视图(屏幕的其余部分显示在背景中)。弹出窗口是我在 IB 中创建的计算器 UIView。根据 Apple 的开发人员指南,弹出式显示似乎比定制键盘更好。

这是我的问题。如何捕获 UITextField 上的触摸以及如何显示子视图?

我已经尝试过以下方法来显示子视图,但没有成功:

    CustomCalculator *customCalc = [[CustomCalculator alloc] initWithNibName:@"CustomCalculator" bundle:nil];

UIViewController *calcController = [self.customCalc.view];

[self.view addSubview:calcController.view];

【问题讨论】:

  • UIViewController *calcController = [self.customCalc.view]; ??为什么要将 UIView 分配给 UIViewController 对象?
  • @Heather: 如果 CustomCalculator 是 UIViewController 的子类,你可以去掉第 3 行,直接使用 [self.view addSubView:customCalc.view];

标签: iphone uitextfield subview addsubview


【解决方案1】:

使用委托方法:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
   //Add your subview here 

   return NO; //this will stop the keyboard from poping up
  }

这样,当有人点击文本字段时,您的视图将弹出而不是键盘。 现在,一旦用户与您的视图交互,您将不得不直接操作 textfield.text 属性中的字符串,作为对用户点击视图中的按钮的反应。

【讨论】:

  • 对上述方法返回 NO 不会触发 textViewFieldDidBeginEditing 方法。那么我们如何知道文本字段是否已被触摸?然后我们可能需要拦截对 textField 区域的触摸。一个更简单的解决方案是拦截 textFieldDidBeginEditing 中的触摸并在 textField 上使用 resignFirstResponder 消息以使键盘根本不会出现。
  • 我们知道文本字段被触摸是因为 textfieldShouldBeginEditing 被触发了。这就是它的用途。在 textFieldDidBeginEditing 处捕获键盘意味着稍后在流程中停止键盘。
  • 没什么……我时不时地试着用鼠标把桌子上的空可乐瓶移到我的垃圾桶里:)
【解决方案2】:

实现 UITextFieldDelegate 及其方法

-(void) textFieldDidBeginEditing:(UITextField *)textField

当您触摸 UITextField 时会触发上述方法。然后,您可以定位 UIPopoverController(我猜这就是您用来在弹出窗口中显示视图的内容),并且一旦您完成,将值传递回 UITextField。因此,弹出框/viewcontroller 的代表应该是您的文本字段对象。

编辑:在看到下面的其他答案后,我感到很震惊,我忘了告诉你如何阻止键盘显示。只需将此作为我上面提到的方法的第一行:

    [textField resignFirstResponder];

【讨论】:

  • 有没有办法在没有 UIPopoverController 的情况下做到这一点?我可以以某种方式添加子视图吗?
  • 模式视图是另一种选择。或者,如果这让您感到困扰,您可以从弹出窗口中删除箭头。只需将 0 传递给 allowedArrowDirections 即 self.popoverController presentPopoverFromRect:add.frame inView:self.view allowedArrowDirections:0 animated:YES];
  • 或者您可以将其添加为适当坐标的子视图,并在完成将数据传递到 UITextField 后使用 removeFromSuperView 将其删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多