如何将字符发送到UISearchBar的光标位置?

时间:2011-08-13 02:06:18

标签: iphone uisearchbar uikeyboard

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

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

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

更新

我找到了一个领导:

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

由于记录了搜索栏中有UITextField,如果我通过搜索栏的子视图查找并找到所述文本字段(假设99%确定文本字段有委托),那么它是否有意义我可以“窃取”文本字段并使我的类成为委托,然后在完成后将消息转发给原始委托吗?

2 个答案:

答案 0 :(得分:1)

您不能简单地设置text的{​​{1}}吗?当然,棘手的部分是确定光标位置。为此,您可以在UISearchBar上注册UITapGestureRecognizer,确定点击坐标&使用UISearchBar或其变体计算光标位置。

您可能还需要注册- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode,因为用户可以通过点按,拖动和更改来更改光标位置。然后释放手指。

HTH,

阿克沙伊

答案 1 :(得分: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 插槽中使用我自己的放大镜等)并将其添加为我的navigationBar的titleView来成功完成此操作。但是,如果我理解你的问题,那仍然是不够的,因为UITextField不提供 selectedRange ,并且其委托不提供等效的 textViewDidChangeSelection: 。你可能有一个固定在一行的UITextView(如果需要,滚动夹紧 - 通常似乎是这样)。