从其他viewcontroller调用时,tableviewcontroller无法正常工作

时间:2017-03-31 05:12:49

标签: ios objective-c iphone

我在storyboard中创建了两个tableViewControllers: 类别和商店。 当我选择一个类别时,它应该显示该类别中的所有商店。 (我从服务器获取商店数据,但我在网址中设置了固定类别,因此无论如何都应该获取相同的两个商店。)

奇怪的是,当我选择一个类别时,storesController显示为空, 但如果我把它设置为初始控制器,它就可以工作。

StoreTableViewController_as_initial.png

StoreTableViewController_from_categories.png

这就是我在storeController中设置单元格的方式。

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
StoresCell *cell = [tableView dequeueReusableCellWithIdentifier:@"storetile"];
if(cell == nil){
    cell = [[StoresCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"storetile"];
}

cell.storelabel.text = [[_results objectAtIndex:[indexPath row]]objectForKey:@"name"];
[cell.storelabel sizeToFit];
cell.subtitleOneLabel.text=[[_results objectAtIndex:[indexPath row]]objectForKey:@"neighborhood"];
cell.subtitleTwoLabel.text = [[_results objectAtIndex:[indexPath row]]objectForKey:@"city"];
NSString *distance = [NSString stringWithFormat:@"~%@ km",[[_results objectAtIndex:[indexPath row]]objectForKey:@"distance"]];
cell.distanceLabel.text = distance;
NSString *imgPath = [[_results objectAtIndex:[indexPath row]]objectForKey:@"imgUrl"];
UIImage *thumb = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://andrafterdevelopment.com.br/apps/buscaabc/img/%@",imgPath]]]];

[cell.thumbImage setImage:thumb];
return cell;
}

我在返回时断开,方法总是被调用,但是当它来自categoriesController时,我单元格中的所有标签都是零。

这就是我从categoriesController

调用storeController的方法
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
    (NSIndexPath *)indexPath{

NSDictionary *item = [_results objectAtIndex:[indexPath row]];
BOOL hasSub = [[item objectForKey:@"hasSub"] boolValue];

    StoreTableViewController *storesTableViewController = [[StoreTableViewController alloc]init];


    //storesTableViewController.title = [item valueForKey:@"name"];
    //storesTableViewController.category = (int)[item valueForKey:@"id"];
    [storesTableViewController.tableView registerClass:[StoresCell class] forCellReuseIdentifier:@"storetile"];
    [self.navigationController pushViewController:storesTableViewController animated:YES];
}

我猜这与自定义单元格有关,或者我这样做是错误的。

3 个答案:

答案 0 :(得分:0)

我猜您已将_results声明为StoreTableViewController中的财产了吗? 如果是这样,请将您的categoriesController方法更改为:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
    (NSIndexPath *)indexPath{

NSDictionary *item = [_results objectAtIndex:[indexPath row]];
BOOL hasSub = [[item objectForKey:@"hasSub"] boolValue];

    StoreTableViewController *storesTableViewController = [[StoreTableViewController alloc]init];
    storesTableViewController.title = [item valueForKey:@"name"];
    storesTableViewController.category = (int)[item valueForKey:@"id"];

    [self.navigationController pushViewController:storesTableViewController animated:YES];
}

在viewDidLoad中注册单元格。

答案 1 :(得分:0)

如果您使用Storyboard,则应通过Storyboard创建控制器。 在Storyboard ID中为Identity inspector设置StoreTableViewController并更改您的方法:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
    (NSIndexPath *)indexPath{

NSDictionary *item = [_results objectAtIndex:[indexPath row]];
BOOL hasSub = [[item objectForKey:@"hasSub"] boolValue];

    StoreTableViewController *storesTableViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"storyboard id"];
    storesTableViewController.title = [item valueForKey:@"name"];
    storesTableViewController.category = (int)[item valueForKey:@"id"];

    [self.navigationController pushViewController:storesTableViewController animated:YES];
}

或者您可以使用segues并在StoreTableViewController方法中配置prepareForSegue

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
 if ([segue.identifier isEqualToString:@"StoreTableViewControllerSegureIdentifier"]) {
    StoreTableViewController *storesTableViewController = segue.destinationViewController;
    storesTableViewController.title = _selectedItem.title;
    storesTableViewController.category = _selectedItem.identifier;
  }
}

答案 2 :(得分:0)

我认为你应该检查一些代码。

当您打开所选类别的第二个视图控制器时,您的服务是否为您提供数据?

如果您正在获取数据,那么它是否以正确的方式填充数组?

如果上面的所有内容都没问题,那么在填充数组中的数据后,您是否已调用[tableView reloadData]方法。