2

ScopeBarを有効にして、Monotouch.DialogコントロールでSelectedScopeButtonIndexChangedを接続すると、 EnabledSearch=trueを設定すると有効になる自動検索機能が無効になります。

無効になる方法は次のとおりです。

     UISearchBar sb = SearchBar;
     if (sb != null)
     {
        sb.ScopeButtonTitles = new string[] { "Girl".t(),"Boy".t(),"All".t() };
        sb.ShowsScopeBar = true;
        sb.SizeToFit();
        // THIS NEXT LINE KILLS SEARCH, remove to make it all work again
        sb.SelectedScopeButtonIndexChanged+= (sender, e) => {Update();};
     }
4

1 に答える 1

4

これが検索を中断する理由は、DialogViewControllerがUISearchBarにカスタムUISearchBarDelegateを割り当てるためです。

イベントに接続すると、デリゲートが上書きされ、すべてのデリゲートメソッドがイベントに転送される特別なUISearchBarDelegateに置き換えられます。

つまり、デリゲートを同じコントロール上のイベントと組み合わせて一致させることはできません。

考えられる解決策の1つ(MonoTouch.Dialog自体にパッチを適用したくない場合)は、既存のsb.Delegateを独自のカスタムUISearchBarDelegateに置き換えて、SearchScopeメソッドを実装し、他のすべてを以前に設定されたUISearchBarDelegateに転送することです。

例えば:

public class MySearchBarDelegate : UISearchBarDelegate
{
    UISearchBarDelegate original;
    MyDialogViewController dvc;

    public MySearchBarDelegate (MyDialogViewController dvc, UISearchBarDelegate original)
    {
        this.original = original;
    }

    public override void SelectedScopeButtonIndexChanged (UISearchBar searchBar, int selectedScope)
    {
        dvc.Update ();
    }

    public override void OnEditingStarted (UISearchBar searchBar)
    {
        original.OnEditingStarted (searchBar);
    }

    public override void OnEditingStopped (UISearchBar searchBar)
    {
        original.OnEditingStopped (searchBar);
    }

    public override void TextChanged (UISearchBar searchBar, string searchText)
    {
        original.TextChanged (searchBar, searchText);
    }

    public override void CancelButtonClicked (UISearchBar searchBar)
    {
        original.CancelButtonClicked (searchBar);
    }

    public override void SearchButtonClicked (UISearchBar searchBar)
    {
        original.SearchButtonClicked (searchBar);
    }
}
于 2013-01-28T20:23:49.970 に答える