仅从indexPath中选择不同的UITableViewCell

时间:2015-04-21 17:14:52

标签: ios objective-c uitableview

我有一个方案,在UITableViewCell中选择didSelectRowAtIndexPath:后,我需要加载并从其他UITableViewCell获取信息。

我正在注册并使用两个不同的xib作为我的tableViewCells来进行更多自定义。

- (void)viewDidLoad{
    [super viewDidLoad];

    self.TABLE_ROW_HEIGHT = 66;

    self.tblView.delegate = self;
    self.tblView.dataSource = self;

    [self.tblView registerNib:[UINib nibWithNibName:@"BasicCell" bundle:nil] forCellReuseIdentifier:@"BasicCell"];

    [self.tblView registerNib:[UINib nibWithNibName:@"DetailCell" bundle:nil] forCellReuseIdentifier:@"DetailCell"];
}

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

    //Property of the view controller which is an IndexPath
    self.selectedIndex = indexPath;

    BasicModel *basicModel = [self.models objectAtIndex:indexPath.row];

    [self.apiClient detailModelSearch:basicModel.id];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    if([self.selectedIndex isEqual:indexPath]){

        return 400.0f;
    }

    return 66.0f;
}

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

    BasicModel *basicModel = [self.models objectAtIndex:indexPath.row];

    UITableViewCell *tableCell = nil;

    if([self.selectedIndex isEqual:indexPath]){

        DetailCell *detailCell = [tableView dequeueReusableCellWithIdentifier:@"DetailCell"];

        tableCell = detailCell;
    }

    else{

        BasicCell *basicCell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell"];

        tableCell = basicCell;
    }

    return tableCell;
}

-(APIClient *)apiClient{

    if(!_apiClient){

        _apiClient = [APIClient new];

        __weak ViewController *_self = self;

        _apiClient.detailModelSearchFinished = ^(DetailModel *detailModel){

            _self.detailModel = detailModel;

           //Problem is here 
           DetailCell *cell = [_self.tblView cellForRowAtIndexPath:_self.selectedIndexPath;

            dispatch_async(dispatch_get_main_queue(), ^{

                [_self.tblView beginUpdates];
                [_self.tblView endUpdates];
                [_self.tblView reloadData];
            });
        };

    }

    return _apiClient;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.models.count;
}     

基本结构如下。

  1. App加载并将所有BasicModel加载到models数组中。
  2. 用户选择提示API详细搜索请求的单元格
  3. 详细搜索请求完成后,回调将返回DetailModel
  4. 接下来会发生什么,因为我知道所触摸的单元格的选定索引路径,我想使用DetailCell而不是BasicCell来呈现来自DetailModel的详细信息。我的问题是我打电话

    DetailCell * cell = [_ self.tblView cellForRowAtIndexPath:_self.selectedIndexPath;

  5. 我总是收到没有详细视图组件的BasicCell,我需要将detailModel绑定到。

    BasicCell xib

    enter image description here

    细节细胞Xib

    enter image description here

    表格视图正常:

    enter image description here

    表格视图扩展了细节Cel xib

    enter image description here

2 个答案:

答案 0 :(得分:0)

好的,现在很清楚。 我可以想到两种方式,一种是如果你不关心花哨的动画,只需删除(基本)单元格并在同一索引路径上插入一个新的(细节)单元格,只有在你将模型更新为好,并执行最终的类型检查。 快速而肮脏,如果你想要更干净的东西,你可能想要使用polimorfism或其他合适的模式重构模型对象。

另一种方法是使用接收的数据直接更新单元格。您可以应用一些精美的动画,但可能会失去一些表演优势。

答案 1 :(得分:0)

实际上非常简单的解决方案。在我可以获取扩展的单元格之前,必须先调用重新加载数据。这很简单:

           [_self.tblView beginUpdates];
            [_self.tblView endUpdates];
            [_self.tblView reloadData];

               DetailCell *expandedCell = (DetailCell *) [_self.tblView cellForRowAtIndexPath:_self.selectedIndex];

             expandedCell.lblData.text = @"IT WORKS!";


        });