2014-05-14 5 views
0

이것이 어떻게 수행 될지 예가 있는지 궁금한가요?MVVMCross로 iOS에서 검색 구현

그래서 MVVCross를 사용하여 검색을 구현하고 실제로 시작하는 방법을 배우지 않으려 고합니다. 오른쪽 방향에 대한 조언은 크게 appriciated 것입니다. 가치가 무엇으로

, 내 생각은 다소 그런 간다 ...

내가 검색 창을 하나 개의보기를 가지고있다. 그러나 나는 그 관점에서 데이터를 조사하지 않을 것이다. 따라서 검색시 새 테이블보기를 표시하고 검색 할 수 있습니다.

테이블과 컨트롤러에 표시 할 셀을 만들었으나 (그냥 usuall 목록보기와 같은 것들), 이제는 검색 막대를 구현해야합니다.

public partial class HomeView : MvxViewController 
{ 
    public HomeView() : base ("HomeView", null) 
    { 
    } 

    public override void DidReceiveMemoryWarning() 
    { 
     // Releases the view if it doesn't have a superview. 
     base.DidReceiveMemoryWarning(); 

     // Release any cached data, images, etc that aren't in use. 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     if (RespondsToSelector(new MonoTouch.ObjCRuntime.Selector("edgesForExtendedLayout"))) 
      EdgesForExtendedLayout = UIRectEdge.None; 
     RecommendedCollectionView.RegisterNibForCell(RecommededStationCollectionCell.Nib, RecommededStationCollectionCell.Key); 
     var source = new MvxCollectionViewSource(RecommendedCollectionView, RecommededStationCollectionCell.Key); 
     RecommendedCollectionView.Source = source; 

     var set = this.CreateBindingSet<HomeView, HomeViewModel>(); 
     set.Bind(source).To(vm => vm.Genres); 
     set.Apply(); 
     RecommendedCollectionView.ReloadData(); 
     var gesture = new UITapGestureRecognizer (() => { 

     }); 

     View.AddGestureRecognizer (gesture); 
    } 
} 

그리고 목록보기 : 사용자 입력 홈보기에서 검색 창에 뭔가가, searchView 목록을 표시하고 내부의 데이터를 검색 할 때

public class SearchView : UITableViewController 
{ 
    public SearchView() : base ("SearchView", null) 
    { 
    } 

    public override void DidReceiveMemoryWarning() 
    { 
     // Releases the view if it doesn't have a superview. 
     base.DidReceiveMemoryWarning(); 

     // Release any cached data, images, etc that aren't in use. 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 


     var source = new MvxSimpleTableViewSource (TableView, SearchTableCell.Key, SearchTableCell.Key); 
     TableView.Source = source; 
     TableView.RowHeight = 50; 

     var set = this.CreateBindingSet<SearchView, SearchViewModel>(); 
     set.Bind (source).To (vm => vm.Genres); 
     set.Apply(); 
     TableView.ReloadData(); 
     // Perform any additional setup after loading the view, typically from a nib. 
    } 
} 

그래서 그것을 요약하기는, 내가 원하는 것입니다.

감사합니다.

답변

7

감사합니다. 나의 시력에 대한 늦은 답변에 대해 유감스럽게 생각하는 모든 답변은 MVVMCross를 더 잘 이해하는 데 도움이됩니다.그래서 결국이 솔루션으로 끝났습니다. 이 접근법에 대해 약간의 의견이있는 경우, 제가 지적 할 수 있다면 행복 할 것입니다.

그래서 뷰 ​​모델에는 검색 대상 텍스트에 바인딩되는 문자열 propery가 있습니다. 텍스트 변경이있을 때마다 목록을 필터링합니다.

private string _searchTerm; 
    public string SearchTerm 
    { 
     get { return _searchTerm; } 
     set { 
      _searchTerm = value; 
      if (String.IsNullOrEmpty(_searchTerm)) { 
       _genres = new List<Genre>(); 
      } else { 
       _genres = allGenres.Where (g => g.Name.ToLower().Contains (_searchTerm.ToLower())).ToList(); 
      } 
      RaisePropertyChanged (() => SearchTerm); 
      RaisePropertyChanged (() => Genres); 
     } 
    } 

그리고보기는 그냥 바인딩 :

set.Bind (SearchBar).For (x=>x.Text).To (vm => vm.SearchTerm); 

그리고 물론

목록 테이블 소스에 바인드가

그래서보기 모델은 그런 일을 보인다. 그게 전부입니다.

+0

감사합니다. 이것은 최고 대답이어야합니다. –

4

귀하가 찾고있는 것인지 확실하지 않습니다. 사용자가 타이핑을 시작하면 사용자에게 표시되는 목록이 새로 고쳐집니다. 확실하지 않으면 그게 당신의 찾고 있지만 그것이 나를 위해 일한.

/// <summary> 
    /// Views the did load. 
    /// </summary> 
    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     _searchBar = new UISearchBar(new RectangleF(0, 0, 320, 44)) 
     { 
      AutocorrectionType = UITextAutocorrectionType.Yes 
     }; 
     _searchBar.SearchButtonClicked += SearchBar_SearchButtonClicked; 
     _searchBar.TextChanged += SearchBarOnTextChanged; 
     _searchBar.CancelButtonClicked += SearchBarOnCancelButtonClicked; 

     var source = new MvxSimpleTableViewSource (TableView, SpeciesListCellView.Key, SpeciesListCellView.Key); 

     var set = this.CreateBindingSet<SpeciesListView, SpeciesListViewModel>(); 
     set.Bind(source).To(vm => vm.Species); 

     set.Apply(); 

     TableView.RowHeight = 50; 
     TableView.Source = source; 
     TableView.TableHeaderView = _searchBar; 
     TableView.ReloadData(); 
    } 

그럼 난 당신이 원래 목록의 전체 사본을 보관 확인하고, 그런 다음 내 뷰 모델에 난 그냥 목록을 새로 고침 된 핸들러
 /// <summary> 
    /// Searches the bar on cancel button clicked. 
    /// </summary> 
    /// <param name="sender">The sender.</param> 
    /// <param name="eventArgs">The <see cref="EventArgs"/> instance containing the event data.</param> 
    private void SearchBarOnCancelButtonClicked(object sender, EventArgs eventArgs) 
    { 
     ((SpeciesListViewModel)ViewModel).SearchSpecieByText(string.Empty); 
     BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder()); 
    } 

    /// <summary> 
    /// Searches the bar on text changed. 
    /// </summary> 
    /// <param name="sender">The sender.</param> 
    /// <param name="e">The <see cref="UISearchBarTextChangedEventArgs"/> instance containing the event data.</param> 
    private void SearchBarOnTextChanged(object sender, UISearchBarTextChangedEventArgs e) 
    { 
     if (string.IsNullOrWhiteSpace(_searchBar.Text)) 
     { 
      ((SpeciesListViewModel)ViewModel).SearchSpecieByText(string.Empty); 

      BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder()); 
     } 
     else 
     { 
      ((SpeciesListViewModel)ViewModel).SearchSpecieByText(_searchBar.Text); 
     } 
    } 

    /// <summary> 
    /// Handles the SearchButtonClicked event of the SearchBar control. 
    /// </summary> 
    /// <param name="sender">The source of the event.</param> 
    /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> 
    private void SearchBar_SearchButtonClicked(object sender, EventArgs e) 
    { 
     ((SpeciesListViewModel)ViewModel).SearchSpecieByText(_searchBar.Text); 
     BeginInvokeOnMainThread(() => _searchBar.ResignFirstResponder()); 
    } 

를 유선.

 /// <summary> 
    /// Searches the specie by text. 
    /// </summary> 
    /// <param name="text">The text.</param> 
    public void SearchSpecieByText(string text) 
    { 
     if (string.IsNullOrWhiteSpace(text)) 
      Species = FullSpeciesList; 
     else 
     { 
      Species = FullSpeciesList; 
      Species = Species.Where(m => m.Name.ToLowerInvariant().Contains(text.ToLowerInvariant())).ToList(); 
     } 
    } 

다음 속성 종은 다음 RaisePropertyChanged 방법 립톤의 대답에 추가

1

부를 것이다 : 검색은 VM에서 발생하고 싶다면,

옵션 1) 소스로 관찰 할 수있는 사전을 가지고 , 그리고 그것으로 업데이 트되면 mvx (내 취향에 조금 비싸다)에 대한 이벤트를 올릴 것이다

옵션 2) 정상적인 소스를 가지고, 필터링, 약한 메시지처럼 VM에서 일종의 이벤트를 제기) 다음 v를 강제로 데이터를 다시로드하려면 (정확한 구문을 기억할 수는 없지만 Table.ReloadData의 행을 따라야합니다.)

보기 측면에서 : 데이터 소스를 필터링 및 업데이트하고, reloadData를 다시 사용하면 더 간단합니다.

경고 : 귀하가 검색 바에 등록한 모든 이벤트를 해지해야합니다. 이상적으로 ViewDidLoad에 연결하는 대신 ViewWillAppear을 사용해야하며 ViewDidDisappear를 사용해야 할 경우

searchBar에는 위임 집합 (_searchBar.Delegate =) 집합이있을 수 있습니다. 여기에는 한 가지만 있으므로 복수 대신에 null을 설정한다.