【问题标题】:display popover when user click into text field?当用户单击文本字段时显示弹出窗口?
【发布时间】:2011-02-24 04:06:15
【问题描述】:

您好,我一直在关注一本书,介绍如何在用户单击工具栏按钮项时显示弹出框。它工作正常,但我想在用户单击文本字段时显示弹出框。似乎会进行一些细微的调整。就像改变 IBAction “showPopover”方法有点。这是该方法的代码:

- (IBAction)showPopover:(id)sender{

    if(popoverController == nil){   //make sure popover isn't displayed more than once in the view
        popoverController = [[UIPopoverController alloc]initWithContentViewController:popoverDetailContent]; 

    [popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    popoverController.delegate = self;
    }
}

除了“presentPopoverFromBarItem”之外,还有另一个实例方法被调用 “presentPopoverFromRect”。我会用它来代替吗?我试图为它编写代码,但我不确定如何将它与我的 TextField 关联或如何绘制所需的矩形。有人可以帮我吗?谢谢。

【问题讨论】:

    标签: objective-c cocoa-touch uitextfield uipopovercontroller


    【解决方案1】:

    您必须使用文本字段委托方法textViewShouldBeginEditing:

    类似这样的:

    - (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
        if(popoverController == nil){   //make sure popover isn't displayed more than once in the view
            popoverController = [[UIPopoverController alloc]initWithContentViewController:popoverDetailContent]; 
        }
        [popoverController presentPopoverFromRect:textView.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
        popoverController.delegate = self;
        return NO; // tells the textfield not to start its own editing process (ie show the keyboard)
    }
    

    【讨论】:

    • 这是有道理的!谢谢! textView.frame 只是采用 textView 的默认大小吗?如何为第一个参数创建自定义矩形视图?
    • 我的视图中有 5 个文本字段,但我只需要在一个字段中使用它。
    【解决方案2】:

    对于那些想要显示弹出框,但不想在点击文本字段时显示键盘的人,这是我一直使用的解决方案(注意这与之前的答案不同 textFieldShouldBeginEditing ):

    /*
     *  Handle when text field is about to start edit mode
     */
    - (BOOL)textFieldShouldBeginEditing:(UITextField *) textField
    {
      // Create popover controller if nil
      [self.myPopover presentPopoverFromRect:textField.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
      return NO;
    }
    

    希望这会有所帮助!

    【讨论】:

    • 我的视图中有 5 个文本字段,但我只需要在一个字段中使用它
    • Chandru,为您的文本字段设置标签,然后在您的 textFieldShoudlBeginEditing 方法中,像这样检查标签:if (textField.tag = 5)
    • 谢谢你,好主意!
    【解决方案3】:

    如果您的 textField 位于表格单元格内,您的弹出框将指向屏幕顶部,因为 textField 框架的框架是参考包含该文本字段的视图。所以你需要给它正确的视图参考。您需要使用 textField.superview 作为您的视图参考。

    - (BOOL)textFieldShouldBeginEditing:(UITextField *) textField
    {
        ...
        [self.myPopover presentPopoverFromRect:textField.frame inView:textField.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
        return NO;
    }
    

    【讨论】:

      【解决方案4】:

      是的,有一个presentPopoverFromRect 方法。

      要将其连接到 UITextField,您需要实现 UITextFieldDelegate 并从 textFieldDidBeginEditing 方法调用您的 showPopover 代码。

      你使用的rect应该是TextField的rect。

      【讨论】:

      • 我的视图中有 5 个文本字段,但我只需要在一个字段中使用它。
      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多