iphone UISearchBar完了ボタンは常に有効です


Answers

テキストフィールドを見つけるまで、UISearchBar内のサブビューをループすることで回避できます。 その場合、 "enablesReturnKeyAutomatically"をNOに設定するだけです。 ちなみに、次のコードは、キーボードタイプの設定にも便利です。

  // loop around subviews of UISearchBar
  for (UIView *searchBarSubview in [searchBar subviews]) {    
    if ([searchBarSubview conformsToProtocol:@protocol(UITextInputTraits)]) {    
      @try {
        // set style of keyboard
        [(UITextField *)searchBarSubview setKeyboardAppearance:UIKeyboardAppearanceAlert];

        // always force return key to be enabled
        [(UITextField *)searchBarSubview setEnablesReturnKeyAutomatically:NO];
      }
      @catch (NSException * e) {        
        // ignore exception
      }
    }
  }
Question

私はUISearchBarを持つUIViewControllerを持っています。 検索ボタンを完了ボタンに置​​き換えました。

ただし、検索バーをタップすると、[完了]ボタンは最初は無効になります。 これは、いずれかの文字を入力するまで発生します。

私がしたいことは、このDoneボタンを常に有効にして、それをタップするとキーボードをすぐに閉じることができるようにすることです。

どんな助け? それは高く評価されるだろう。

私は私のUIViewControllerに持っている

-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar  
{   
    return YES;  
}  

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
}  

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText  
{  
    if (searchBar.text.length == 0)  
    {  
        //[self fixOrientation];  
        [searchBar resignFirstResponder];  
    }   
    else  
    {  
        NSLog(@"typed");  
    }  
}  


-(void)searchBarTextDidBeginEditing:(UISearchBar *)theSearchBar  
{  
    NSLog(@"began");  // this executes as soon as i tap on the searchbar, so I'm guessing this is the place to put whatever solution is available  
}  



スウィフトの拡張機能:

extension UISearchBar {
    var textField: UITextField? {
        return getTextField(inViews: subviews)
    }

    private func getTextField(inViews views: [UIView]?) -> UITextField? {
        guard let views = views else { return nil }

        for view in views {
            if let textField = (view as? UITextField) ?? getTextField(inViews: view.subviews) {
                return textField
            }
        }

        return nil
    }
}

使用法:

searchBar.textField?.returnKeyType = .Done
searchBar.textField?.enablesReturnKeyAutomatically = false



たとえば、マップアプリケーションに基づいて、パターンは、キーボードを取り除くためにテキストフィールドの近くにキャンセルボタンがあるようにする必要があります。 これで、Donalボタンのように見えるカスタムUIButtonをそのコーナーに置くことをお勧めします。

ハッキーなソリューションの種類...

お役に立てれば!




iOS 8以上の場合は、

[self.searchBar setReturnKeyType:UIReturnKeyDone];
[self.searchBar setEnablesReturnKeyAutomatically:NO];