2016-04-08 9 views
-1

私はcitiesという配列をユーザーに追加したいと思っています。iOS 9の検索バーを使って作業する

add screenユーザーが入力を開始すると、(配列の)都市のオプションがテーブルビューに表示されます。

インターネットで何時間も検索しましたが、すべてが古くて最新ではないようです(AppleはiOS 8と9でいくつかのことを非難しました)。

私はそれを行う方法に関する最新のチュートリアルを探していますが、誰でも手伝うことができますか?

ありがとうございました!

+0

チュートリアルを使用します。例:http://code-ninja.org/blog/2012/01/08/ios-quick-tip-filtering-a-uitableview-with-a-search-bar/動作しない場合は、試していることを教えてくださいどこに問題があるのか​​。例えば...セルのinitWithStyleが削除されたので、私はこのことをすることができません。なんでも。あなたが持っているものを私たちに教えてください。ソースコードやスクリーンショットを含める。 – LawfulEvil

答えて

5

都市の配列を検索/フィルタリングしたいのですがどうすればいいですか?

いずれにせよ、これはiOS9のUISearchControllerでやります。

0)あなたは)それはだ場合のtableView(これらのプロトコルが必要になります。

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    if (!_searchController.searchBar.superview) { 
     self.tableView.tableHeaderView = self.searchController.searchBar; 
    } 
    if (!self.searchController.active && self.searchController.searchBar.text.length == 0) { 
     self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(self.searchController.searchBar.frame)); 
    } 
} 


- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    if (self.searchController.isActive) { 
     self.searchController.active = NO; 
    } 
} 

viewWillAppearとviewWillDisappearに

@property (nonatomic, strong) UISearchController *searchController; 
@property (nonatomic, readonly) NSArray *searchResults; 

3):

@interface YourViewController() <UITableViewDelegate, UITableViewDataSource, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating> 

1)は、これらのプロパティを宣言します3)searchControllerのゲッター/セッター:

#pragma mark - Getters/Setters 

- (UISearchController *)searchController { 
    if (!_searchController) { 
     _searchController = [[UISearchController alloc]initWithSearchResultsController:nil]; 
     _searchController.searchResultsUpdater = self; 
     _searchController.dimsBackgroundDuringPresentation = NO; 
     _searchController.searchBar.delegate = self; 
     [_searchController.searchBar sizeToFit]; 
    } 
    return _searchController; 
} 

- (NSArray *)searchResults { 
    NSString *searchString = self.searchController.searchBar.text; 
    if (searchString.length > 0) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[c] %@", searchString]; 
     return [self.cities filteredArrayUsingPredicate:predicate]; 
    } 
    else { 
     return self.cities; 
    } 

    return @[]; 
} 

4)のtableViewを更新します

#pragma mark - UITableViewDataSource 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
if (self.searchController.isActive && self.searchController.searchBar.text.length > 0) { 
      return self.searchResults.count; 
     } 
     else { 
      return self.cities.count; 
     }   
    return 0; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell; 
    NSString *cityName = @""; 
     cell = [tableView dequeueReusableCellWithIdentifier:@"YourIdentifier" forIndexPath:indexPath]; 
     if (self.searchController.isActive && (![self.searchController.searchBar.text isEqualToString:@""])) { 
      cityName = [self.searchResults objectAtIndex:indexPath.row]; 
     } 
     else { 
      cityName = [self.cities objectAtIndex:indexPath.row]; 
     } 
     ((YourTableViewCell *)cell).cityNameLabel.text = cityName; 
     } 
    return cell; 
    } 

5)

#pragma mark - UISearchControllerDelegate 

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController { 
    [self.tableView reloadData]; 
} 

更新UISearchControllerDelegate

をとにかく、それはそれのJISTです。がんばろう。これについても多くのチュートリアルがあります。

+0

ありがとう!しかし何らかの理由で検索が非常に遅く、UIが数秒間フリーズします。 "citiesArray"は本当に大きいので、おそらくそれが問題(86,111オブジェクト)ですが、どうすれば高速に読み込むことができますか?または、少なくともUIをスムーズにし、フリーズしないようにするには?ありがとうございました! –

+0

ええ、ごめんなさい、私があなたに助けてくれるとは思っていません。配列が非常に小さいので、この問題に遭遇したことはありません。あなたのアレイが本当に大きくなっているのは間違いなく問題に寄与していますが、それを修正する方法はわかりません。 :/ – sallyp

+0

これは完全に機能しています。しかし、名前を辞書の配列に検索している間は、結果は表示されませんでした。だから、辞書の配列については、述語を変更しました: 'NSPredicate * predicate = [NSPredicate predicateWithFormat:@" name CONTAINS [c]%@ "、searchString]; Dic値の 'name'キーワードです –

関連する問題