【问题标题】:How can I send characters to cursor position of UISearchBar?如何将字符发送到 UISearchBar 的光标位置?
【发布时间】:2011-08-13 02:06:17
【问题描述】:

我正在尝试添加一些在普通键盘中不方便放置的字符,并将它们放在工具栏中,以便用户可以像使用普通键一样使用它们。

有没有人有一个可用的方法来做到这一点?

我发现一篇文章解释了如何通过模拟“粘贴”操作来做到这一点,(删除粘贴板内容,替换为我的角色,粘贴到字段中,返回原始粘贴板内容)但我的问题是我尝试使用 UISearchBar 执行此操作,它似乎没有粘贴选择器。

更新

我找到了线索:

UIKIT_CLASS_AVAILABLE(2_0) @interface UISearchBar : UIView { 
  @private
    UITextField            *_searchField;

由于记录在搜索栏中有一个 UITextField,如果我要通过搜索栏的子视图查找所述文本字段,(假设 99% 确定该文本字段有一个委托)是否有意义我可以“窃取”文本字段并让我的班级成为代表,然后在我完成后将消息转发给原始代表?

【问题讨论】:

  • 我不确定这是否可行。快速查看UISearchBar 文档表明它没有从任何有用的东西继承,并且没有明显的方法可以到达光标位置并对其进行操作。您可以使用 UITextView 和您发现的粘贴想法编写自己的搜索栏。

标签: iphone uisearchbar uikeyboard


【解决方案1】:
  • 这绝对是个棘手的问题。 UISearchBar 没有给你 inputAccessoryView,你也没有得到 selectedRange

  • 您可以粘贴到 UISearchBar。如果您想将棘手的字符放到粘贴板上,您可以使用一个按钮来执行以下操作:

    [[UIPasteboard generalPasteboard] setString:@"[*]"];
    

    然后让用户在 UISearchBar 中使用粘贴。不过对用户来说很尴尬。

  • 通过子视图查找 UITextField 可能会起作用。如果你这样做,你需要抓住现有的代表并让自己成为代表。然后您的代表将需要继续传输消息。该过程在this stackoverflow question and answer 中进行了描述。这里的潜在挑战:(a) Apple 实现可能会在 iOS 更新之间发生变化,即使不太可能,在 UISearchBar 的生命周期内更改委托; (b) Apple 可能会将此视为使用私有 API 并拒绝该应用程序。 (我没有关于 (b) 的任何确凿证据,但值得考虑。)

  • 一种方法可能是使用书签按钮。 UISearchBar 委托可以检测到这一点。您可以使用它来插入特殊字符或提供特殊字符插入菜单。当然,你不会知道光标在哪里。但是,根据您的用例,在末尾附加特殊字符可能没问题。也许这不会让你在界面上的一个按钮上得到任何东西,只是附加一些东西。

    [[self searchBar] setText: [NSString stringWithFormat:@"%@[*]", [[self searchBar] text]]].)
    
  • 按照@hyperbole 的建议,实现自己的搜索栏可能是最好的方法。通过添加自定义 UITextField(在 leftView 插槽等中使用我自己的放大镜)并将其添加为我的导航栏的 titleView,我已经成功地做到了这一点。但是,如果我正确理解您的问题,那仍然不够,因为 UITextField 不提供 selectedRange 并且其委托不提供等效的 textViewDidChangeSelection: .您可能会尝试使用固定在一行上的 UITextView(如果需要,可以向下滚动 - 通常似乎是这样)。

【讨论】:

    【解决方案2】:

    你不能简单地设置UISearchBartext 吗?当然,棘手的部分是确定光标位置。为此,您可以在UISearchBar 上注册UITapGestureRecognizer,确定点击坐标并使用- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode 或其变体计算光标位置。

    您可能还需要注册UIPanGestureRecognizer,因为用户可以通过点击、拖动然后松开手指来更改光标位置。

    HTH,

    阿克谢

    【讨论】:

    • 虽然这似乎是一个绝对的噩梦,但它可能是一种可行的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2020-08-03
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多