未调用UITableView cellForRowAtIndexPath

时间:2014-04-18 06:51:17

标签: ios objective-c uitableview

我遇到空表数据问题,因为在我UISearchBar中按搜索后,此方法未被调用。我已经尝试了所有的东西,桌子只是在按下搜索后显示消隐。 此代码从我的json url获取描述并扫描搜索到的单词,然后将该搜索项的任何描述的索引位置放入数组(self.indexArray)。 我想调用表只显示该数组中索引值的那些单元格。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISearchBar *tempSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 64, 320, 40)];
    self.searchBar = tempSearchBar;
    self.searchBar.delegate = self;
    self.searchBar.placeholder = @"Search listings...";

    [self.view addSubview:self.searchBar];

}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [searchBar resignFirstResponder];
    [self sendData];
}

- (void)sendData
{
    NSString *search = self.searchBar.text;
    NSString *temp = [NSString stringWithFormat:@"MY JSON RETRIEVAL LINK"];
    NSURL *url = [[NSURL alloc] initWithString:temp];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
                                     initWithRequest:request];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation
                                           , id responseObject) {
        NSLog(@"%@",responseObject);
        NSLog(@"%@",[responseObject class]);
        self.images = responseObject;
        self.descriptions = [[NSMutableArray alloc] init];
        for (int i = 0; i < [self.images count]; i++)
        {
            [self.descriptions addObject:self.images[i][@"description"]];
        }
        for (int i = 0; i < [self.descriptions count]; i++)
        {
            NSLog(@"%d: %@", i, self.descriptions[i]);
            if ([self.descriptions[i] rangeOfString:search options:NSCaseInsensitiveSearch].location != NSNotFound)
            {
                NSLog(@"ADDING, %d", i);
                [self.indexArray addObject:[NSNumber numberWithInt:i]];
            }
        }
        tableView = [[UITableView alloc] initWithFrame:CGRectMake(0,104,320,480) style:UITableViewStylePlain];
        tableView.dataSource = self;
        tableView.delegate = self;

        [self.view addSubview:tableView];
        [tableView reloadData];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error.localizedDescription);
    }];

    [operation start];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"FUNCTION CALLED");
    TLCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

    if(cell == nil) {
        cell = [[TLCustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"];
    }

    for(UIView *view in cell.contentView.subviews){
        if ([view isKindOfClass:[UIView class]]) {
            [view removeFromSuperview];
        }
    }

    NSString *name = self.images[indexPath.row][@"name"];
    NSString *location = self.images[indexPath.row][@"location"];
    NSString *body = self.images[indexPath.row][@"description"];
    NSString *list_type = self.images[indexPath.row][@"category"];
    NSString *millisecs = self.images[indexPath.row][@"_createdAt"];

    NSDate *date = [NSDate date];
    NSTimeInterval ti = [date timeIntervalSince1970];
    double myDouble = [millisecs doubleValue];
    double delta = (ti * 1000) - myDouble;
    NSString *time = [self calculateInterval:delta];

    cell.nameLabel.text = name;
    cell.locationLabel.text = location;
    cell.bodyLabel.text = body;

    CGFloat fixedWidth = cell.bodyLabel.frame.size.width;
    CGSize newSize = [cell.bodyLabel sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = cell.bodyLabel.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    cell.bodyLabel.frame = newFrame;

    cell.timeLabel.text = time;

    if ([list_type isEqualToString:@"Sell"])
    {
        UIImageView *thumbnailView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sell_icon_small.png"]];
        thumbnailView.frame = CGRectMake(12, 12, 50., 50.);
        [cell addSubview:thumbnailView];
    }
    else if ([list_type isEqualToString:@"Trade"])
    {
        UIImageView *thumbnailView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"trade_icon_small.png"]];
        thumbnailView.frame = CGRectMake(12, 12, 50., 50.);
        [cell addSubview:thumbnailView];
    }
    else if ([list_type isEqualToString:@"Wanted"])
    {
        UIImageView *thumbnailView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"want_icon_small.png"]];
        thumbnailView.frame = CGRectMake(12, 12, 50., 50.);
        [cell addSubview:thumbnailView];
    }
    else
    {
        UIImageView *thumbnailView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ad_icon_small.png"]];
        thumbnailView.frame = CGRectMake(12, 12, 50., 50.);
        [cell addSubview:thumbnailView];
    }

    NSString *temp = self.images[indexPath.row][@"link"];
    if ([temp isEqualToString:@"no_link"])
    {
        _thereIsAnImage = FALSE;
    }
    else
    {
        _thereIsAnImage = TRUE;
    }

    if (_thereIsAnImage)
    {

        SDWebImageManager *manager = [SDWebImageManager sharedManager];
        [manager downloadWithURL:self.images[indexPath.row][@"link"]
                     options:0
                        progress:^(NSInteger receivedSize, NSInteger expectedSize)
         {
             // progression tracking code
         }
                       completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
         {
             if (image)
             {

                 cell.imageView.image = image;

                 cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
                 cell.imageView.clipsToBounds = YES;
                 cell.imageView.tag = indexPath.row;


                 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleImageTap:)];
                 [tap setNumberOfTapsRequired:1];
                 [tap setNumberOfTouchesRequired:1];
                 [cell.imageView setUserInteractionEnabled:YES];
                 [cell.imageView addGestureRecognizer:tap];

             }
         }];
    }

    return cell;

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.indexArray.count;
}

5 个答案:

答案 0 :(得分:2)

如果您是以编程方式执行此操作,则需要在tableview.delegate = self方法中设置tableview.datasource = selfviewDidLoad。在numberOfRowsInSection:中放置一个断点,以查看它返回的数字,以检查它是否大于零。

答案 1 :(得分:0)

您的代码似乎没问题。检查storeybaord中的表是否与表连接并正确委派。

答案 2 :(得分:0)

你放了

@interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

到ViewController.m文件的顶部?

答案 3 :(得分:0)

您需要在viewDidLoad中设置tableView.delegate = selftableView.dataSource = self

答案 4 :(得分:0)

我会请你检查你的头文件 - 它应该包含以下内容......

@interface YourTableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchDisplayDelegate>

调查如何实现UISearchBarDelegateUISearchDisplayDelegate方法来管理(表)视图控制器中的搜索功能。阅读Apple文档UISearchBarDelegateUISearchDisplayDelegate

使用UISearchBar时,您需要UISearchDisplayController来管理搜索结果。

如果您不使用故事板,请务必为UITableViewUISearchDisplayControllerUITableViewController的实例设置相应的数据源和代理。

然后在您的两个表视图数据源方法中,您需要向searchResultsTableView(通过self.searchDisplayController.searchResultsTableView访问)提供信息,以便它知道如何准备搜索结果表视图。

例如......

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger nofRowsInSection = 0;
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        nofRowsInSection = self.searchResults.count;
    } else {
        nofRowsInSection = self.indexArray.count;
    }
    return nofRowsInSection;
}

...和...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ... <<other code>> ...

    NSString *name = nil;
    NSString *location = nil;
    etc...

    if (tableView == self.searchDisplayController.searchResultsTableView) {
            name = self.searchResults[indexPath.row][@"name"];
            location = self.searchResults[indexPath.row][@"location"];
            ...etc...

    } else {
            name = self.images[indexPath.row][@"name"];
            location = self.images[indexPath.row][@"location"];
            ...etc...

    }

    ... <<other code>> ...
}

请注意self.searchResults应该是NSMutableArray,它应该包含搜索结果表视图的数据,通过基于搜索栏文本过滤self.indexArray来准备。

希望这有帮助。