2011-12-16 17 views
9

iOSでshowCancelButton = YESを指定したUISearchBarを使用する5.キーボードがドロップダウンしたときにキャンセルボタンを有効にしておきます。次のコードを使用すると、動作しないようです。UISearchBarキャンセルボタン

for (id subView in self.searchControl.subviews) 
    { 
     if ([subView isKindOfClass:[UIButton class]]) 
     { 
      UIButton *cancelButton = (UIButton *)subView; 
      [cancelButton setEnabled:YES]; 
      break; 
     }   
    } 

サブビューが、実際には見えないUIButtonのオフサブクラス化するUINavigationButtonです。私はここで何が欠けているのですか?また、AppleのドキュメントでUINavigationButtonクラスの情報を見つけることができません。

+0

を、答えのどれもあなたがキャンセルボタンを見つけることになっている方法を説明していません。バイトの答えは、例えば、OPが既に言ったisKindOfClass:UIButtonを使用するだけではうまくいきません。 UINavigationButtonは文書化されていないクラスなので、オブジェクトに送信されたメッセージはすべてあなたのアプリケーションを拒否させるでしょうか? –

答えて

1

私のアプリケーションで同じ問題を解決する必要がありました。部分的な遅延の後、上記のコードを試してみてください。

[self performSelector:@selector(delayedEnable:) withObject:cancelButton afterDelay:0.001]; 

- (void)delayedEnable:(UIButton*)button { 
    button.enabled = YES; 
} 

これは醜いですが、それは私のために働いたものです。また、結果を表示するために実際にUISearchDisplayControllerを使用する場合は、キャンセルボタンの動作も修正する必要があります(この問題を詳しく解説していると思います)。

+0

これは魔法のように働いています.. @ Kurtあなたはどこから来たのか教えてくれますか? Amazing ..upvoted – NSPratik

2

クルト・スピンドラーが彼の記事で言ったことを改善するだけです。これは優れていないかもしれませんが、より多く含まれています。私は同じことをするために発送を使用します。

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ 
    for (UIView *subview in searchBar.subviews) 
    { 
     if ([subview isKindOfClass:[UIButton class]]) 
     { 
      int64_t delayInSeconds = .001; 
      dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
      dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
       UIButton * cancelButton = (UIButton *)subview; 
       [cancelButton setEnabled:YES]; 
      }); 
      break; 
     } 
    } 
} 

これは助けを有効をキャンセルし続ける必要があるすべての人のために働く必要があります。キャンセルまたは検索をクリックして後で隠すようにしてください。

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    [searchBar resignFirstResponder]; 
    [searchBar setShowsCancelButton:NO animated:YES]; 
} 
+0

何かを非同期で実行したい場合は、単にdispatch_asyncを使用してください。あなたは「ほぼ即時の遅延値」を持つdispatch_afterは必要ありません。例えば。この場合、 'dispatch_async(dispatch_get_main_queue()、^(void){...});'は完璧に動作します。 –

+0

私はKurtの答えに基づいて0.001が必要だと信じています。そうでない場合は、あなたのアプローチは完全に受け入れられるでしょう。 – Byte

2

検索バーのキャンセルボタンにカスタムキャンセルボタンを配置しました。

16

検索バーの代理人を設定し、このコードを入力しないでください。

- (void) searchBarSearchButtonClicked:(UISearchBar*) theSearchBar 
    { 
    [theSearchBar resignFirstResponder]; 
    [theSearchBar setShowsCancelButton:NO animated:YES]; 
    } 
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
    { 
    [searchBar setShowsCancelButton:YES animated:YES]; 
    } 
    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 
    { 
    [searchBar resignFirstResponder]; 
    [searchBar setShowsCancelButton:NO animated:YES]; 
    } 

スウィフト3.0

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 
    searchBar .resignFirstResponder() 
    searchBar.setShowsCancelButton(false, animated: true) 
} 
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { 
    searchBar.setShowsCancelButton(true, animated: true) 
} 
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 
    searchBar.resignFirstResponder() 
    searchBar.setShowsCancelButton(false, animated: true) 
} 
1

私はこの1つは古いですが、私はそれを解決することができたと私は私のためにそれを解決したように何かを見つけることができなかったので、ここで働いていた何を知っています(スイフト3):

キーボードが非表示になったときにキャンセルボタンを有効にします。 viewDidLoad()にこれを追加します。

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(notification:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil) 

をkeyboardNotification(通知:)方法では、keyboardDidHide通知に反応する:

func keyboardNotification(notification: NSNotification) { 
    if notification.name == Notification.Name.UIKeyboardDidHide { 
     self.enableSearchCancelButton() 
    } 
} 

enableSearchCancelButtonは、他の人がhereに答えたものから取られています。

func enableSearchCancelButton() { 
    //enable the cancel button 
    for view1 in searchBar.subviews { 
     for view2 in view1.subviews { 
      if let button = view2 as? UIButton { 
       button.isEnabled = true 
       button.isUserInteractionEnabled = true 
      } 
     } 
    } 
} 

最後に、オブザーバーとしてビューコントローラを削除することを忘れないでください:今のよう

deinit { 
    NotificationCenter.default.removeObserver(self) 
} 
関連する問題