簡體   English   中英

Parse.com:搜索TableView

[英]Parse.com: Searching a TableView

嘿,我在一起正在為我的App使用Parse SDK-該界面是在Storyboard中構建的...

我有一個表視圖,該表是從Parse獲取他的數據的,現在我想使其可搜索。

我找到了這篇文章並關注了它,但沒有得到結果! :/

搜索結果已加載,但顯示時出現問題...

我收到以下錯誤:

... myApp[..] *** Assertion failure in -[UISearchResultsTableView _configureCellForDisplay:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m:5471
... myApp[...] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

我做了很多嘗試,但沒有得到結果,這是我的代碼-有人可以幫忙嗎:

對不起,我的英語不好! ;)

#import "FirstLaunchViewController.h"

@interface FirstLaunchViewController ()

@end

@implementation FirstLaunchViewController

#pragma mark - UIViewController
- (void)viewDidLoad {
    [super viewDidLoad];

    [self loadObjects];

    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbar_background.png"] forBarMetrics:UIBarMetricsDefault];

    self.searchResults = [NSMutableArray array];

}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithClassName:@"teams"];
    self = [super initWithCoder:aDecoder];
    if (self) {
        // The className to query on
        self.parseClassName = @"teams";
        self.textKey = @"verein";

        // The key of the PFObject to display in the label of the default cell style
        // self.keyToDisplay = @"text";

        // Whether the built-in pull-to-refresh is enabled
        self.pullToRefreshEnabled = NO;

        // Whether the built-in pagination is enabled
        self.paginationEnabled = YES;

        self.loadingViewEnabled = NO;

        // The number of objects to show per page
        self.objectsPerPage = 50;
    }
    return self;
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

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

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

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

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait || UIInterfaceOrientationIsLandscape(interfaceOrientation));
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {

    PFTableViewCell *cell = (PFTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];

    // Configure the cell

    UIColor *color = [[UIColor alloc] initWithRed:0.0 green:0.0 blue:0.0 alpha:0.0];

    cell.detailTextLabel.backgroundColor = color;

    cell.textLabel.backgroundColor = color;

    cell.backgroundView = [ [UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"cellbackground_n.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0]];
    cell.selectedBackgroundView = [ [UIImageView alloc] initWithImage:[ [UIImage imageNamed:@"cellbackground_down_n.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:5.0]];
    cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"cellarrows.png" ]];

    if (tableView == self.tableView) {
        cell.textLabel.text = [object objectForKey:@"verein"];
    } else {

        PFUser *obj2 = [self.searchResults objectAtIndex:indexPath.row];
        PFQuery *query = [PFQuery queryWithClassName:@"teams"];
        PFObject *searchedUser = [query getObjectWithId:obj2.objectId];
        NSString *content = [searchedUser objectForKey:@"verein"];
        cell.textLabel.text = content;

        NSLog(@"Content: %@", content);

    }

    return cell;

}

-(void)filterResults:(NSString *)searchTerm {

    [self.searchResults removeAllObjects];

    PFQuery *query = [PFQuery queryWithClassName: self.parseClassName];
    [query whereKeyExists:@"verein"]; //this is based on whatever query you are trying to accomplish
    [query whereKey:@"verein" containsString:searchTerm];

    NSArray *results  = [query findObjects];

    NSLog(@"%@", results);
    NSLog(@"%u", results.count);

    [self.searchResults addObjectsFromArray:results];
}


-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    [self filterResults:searchString];
    return YES;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == self.tableView) {
        return self.objects.count;
    } else {
        return self.searchResults.count;
    }
}


@end

問題是您的tableView最初沒有可重用的單元出隊。 您需要檢查dequeueReusableCellWithIdentifier:返回的單元格是否為nil,如果是,則創建一個單元格。

PFTableViewCell *cell = (PFTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (!cell)
{
  cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"];
}
// Configure the cell

...

這樣,您可以保證cell具有值,因此可以避免從此方法返回nil。

要正確處理tableView:didSelectRowAtIndexPath: ,您需要首先檢查哪個tableView觸發了該事件,並進行相應處理。 下面是一個如何工作的示例-您需要替換自己的局部視圖控制器。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  if (tableView == self.tableView) {
    [super tableView:tableView didSelectRowAtIndexPath:indexPath];
  }
  else {
    PFUser *user = PFUser *obj2 = [self.searchResults objectAtIndex:indexPath.row];
    MyDetailViewController *detailController = [[MyDetailViewController alloc] initWithObject:user];
    [self.navigationController pushViewController:datailController animated:YES];
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM