【问题标题】:Change UISearchBar/Keyboard Search Button Title更改 UISearchBar/键盘搜索按钮标题
【发布时间】:2010-04-24 19:38:38
【问题描述】:

在 UISearchBar 控件中,是否可以将键盘的 Search 键标题更改为 Done?

【问题讨论】:

标签: iphone button uisearchbar title


【解决方案1】:

对于名为 tablesearchbar 的搜索栏:

// Set the return key and keyboard appearance of the search bar
        for (UIView *searchBarSubview in [tableSearchBar subviews]) {

            if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {

                @try {

                    [(UITextField *)searchBarSubview setReturnKeyType:UIReturnKeyDone];
                    [(UITextField *)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert];
                }
                @catch (NSException * e) {

                    // ignore exception
                }
            }
        }

【讨论】:

  • 这会通过 App Store 的审批流程吗?
  • 由于没有私有API被访问,因此不应拒绝批准
  • 很好的答案。额外警告:我宁愿在 if 语句中添加第二个条件:&& [searchBarSubview isKindOfClass:[UITextField class],而不是使用 @try-@catch(我们知道在 Objective-C 中并没有那么便宜和优化) ] 为了摆脱@try-catch。
  • 在 iOS 7 中循环遍历子视图对我不起作用,但循环遍历子视图的子视图可以(请参阅我的回答)。
  • //如果你不在主线程上,在'setReturnKeyType'后面插入这个:______ [(UITextField *)searchBarSubview performSelectorOnMainThread:@selector(reloadInputViews) withObject:nil waitUntilDone:NO];
【解决方案2】:

至少对于 iOS 8,简单地说:

    [self.searchBar setReturnKeyType:UIReturnKeyDone];

【讨论】:

    【解决方案3】:

    从 iOS 7 beta 5 开始,Run Loop 的回答对我不起作用,但这样做:

    for(UIView *subView in [searchBar subviews]) {
        if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {
             [(UITextField *)subView setReturnKeyType: UIReturnKeyDone];
        } else {
            for(UIView *subSubView in [subView subviews]) {
                if([subSubView conformsToProtocol:@protocol(UITextInputTraits)]) {
                    [(UITextField *)subSubView setReturnKeyType: UIReturnKeyDone];
                }
            }      
        }
    }
    

    【讨论】:

    • 以防万一,使用 if/else 的原因是 if 是为了向后兼容 iOS 6 而 else 是为了 iOS 7。
    【解决方案4】:

    运行循环代码(在“@try”中)部分的另一个有用提示。

    当文本字段为空时,这会启用“完成”按钮:

    UITextField *tf = (UITextField *)searchBarSubview;
    tf.enablesReturnKeyAutomatically = NO;
    

    【讨论】:

    • 谢谢!这也适用于 Gregory for iOS7 的解决方案。
    【解决方案5】:

    让 Swift 改变 UISearchBar 的返回键

    searchBar.returnKeyType = UIReturnKeyType.done
    

    可用枚举如下

    public enum UIReturnKeyType : Int {
    
        case default
        case go
        case google
        case join
        case next
        case route
        case search
        case send
        case yahoo
        case done
        case emergencyCall
        @available(iOS 9.0, *)
        case continue
    }
    

    【讨论】:

      【解决方案6】:

      只是一个提醒!如果您的 searchBar 仍然是第一响应者,则在您更改 returnKeyType 后,您需要关闭键盘并再次弹出以查看更改。

      search.resignFirstResponder()
      searchBar.returnKeyType = UIReturnKeyType.Done
      search.becomeFirstResponder()
      

      【讨论】:

        【解决方案7】:

        因为它是一个带有可选方法的协议,你应该单独测试每个方法而不是尝试捕获。

        for (UIView *searchBarSubview in searchBar.subviews)
        {
            if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)])
            {
                // keyboard appearance
                if ([searchBarSubview respondsToSelector:@selector(setKeyboardAppearance:)])
                    [(id<UITextInputTraits>)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert];
                // return key 
                if ([searchBarSubview respondsToSelector:@selector(setReturnKeyType:)])
                    [(id<UITextInputTraits>)searchBarSubview setReturnKeyType:UIReturnKeyDone];
                // return key disabled when empty text
                if ([searchBarSubview respondsToSelector:@selector(setEnablesReturnKeyAutomatically:)])
                    [(id<UITextInputTraits>)searchBarSubview setEnablesReturnKeyAutomatically:NO];
                // breaking the loop when we are done
                break;
            }
        }
        

        这适用于 iOS = 7,您需要循环输入 searchBar.subviews[0].subviews

        【讨论】:

          【解决方案8】:

          由于警报式键盘是半透明的,我可以看到它背后的视图。它看起来不太好,因为我在键盘后面有多个元素,这使得按键很难脱颖而出。我想要一个全黑键盘。

          所以我在编辑文本时将黑色 UIImageView 动画到键盘后面的位置。这给出了全黑键盘的外观。

          - (void)textFieldDidBeginEditing:(UITextField *)textField {
          
              [UIView beginAnimations:nil context:nil];
              [UIView setAnimationDuration:0.25]; 
          
              blackBoxForKeyboard.frame = CGRectMake(0, 377, 320, 216);
              [UIView commitAnimations]; 
          
          }
          

          【讨论】:

            【解决方案9】:

            我尝试了此处显示的所有解决方案,但没有一个适用于我的 UISearchBar(xcode5 为 iOS7 编译)。我最终得到了这个对我有用的递归函数:

            - (void)fixSearchBarKeyboard:(UIView*)searchBarOrSubView {
            
                if([searchBarOrSubView conformsToProtocol:@protocol(UITextInputTraits)]) {
                    if ([searchBarOrSubView respondsToSelector:@selector(setKeyboardAppearance:)])
                        [(id<UITextInputTraits>)searchBarOrSubView setKeyboardAppearance:UIKeyboardAppearanceAlert];
                    if ([searchBarOrSubView respondsToSelector:@selector(setReturnKeyType:)])
                        [(id<UITextInputTraits>)searchBarOrSubView setReturnKeyType:UIReturnKeyDone];
                    if ([searchBarOrSubView respondsToSelector:@selector(setEnablesReturnKeyAutomatically:)])
                        [(id<UITextInputTraits>)searchBarOrSubView setEnablesReturnKeyAutomatically:NO];
                }
            
                for(UIView *subView in [searchBarOrSubView subviews]) {
                    [self fixSearchBarKeyboard:subView];
                }
            }
            

            然后我这样称呼它:

            _searchBar = [[UISearchBar alloc] init];
            [self fixSearchBarKeyboard:_searchBar];
            

            【讨论】:

            • 在 Xcode 5 + iOS7 中,文本输入将在子视图而不是子视图中。所以基本上你使用了我的 Xcode 4 解决方案并添加了一个递归调用。为获得最佳性能,您可以测试 iOS 版本,如果是 iOS7,则浏览 subviews[0].subviews 而不是 subviews
            【解决方案10】:

            仅用于涵盖所有 iOS 版本:

            NSArray *subviews = [[[UIDevice currentDevice] systemVersion] floatValue] < 7 ? _searchBar.subviews : _searchBar.subviews[0].subviews;
            
            for (UIView *subview in subviews)
            {
                if ([subview conformsToProtocol:@protocol(UITextInputTraits)])
                {
                    UITextField *textField = (UITextField *)subview;
                    [textField setKeyboardAppearance: UIKeyboardAppearanceAlert];
                    textField.returnKeyType = UIReturnKeyDone;
                    break;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2013-07-11
              • 1970-01-01
              • 2020-07-27
              • 1970-01-01
              • 2017-09-22
              • 2021-12-12
              • 2023-04-03
              • 1970-01-01
              相关资源
              最近更新 更多