嵌入2个动态UITableViews

时间:2015-03-09 05:00:23

标签: ios objective-c iphone uitableview

我有两个UITableView嵌入到UIViewController中。两者都是动态的并且检索不同的数据。问题是,在使用indexPath时,两个表中都使用了 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

这里有解决方法吗?我正在引用我的实体:

//tableView2 has a cell named differently
static NSString *CellIdentifier = @"Cell";
static NSString *CellIdentifier2 = @"Cell2";

//reference the cells to the right tables
UITableViewCell *cell = [self.tableView1 dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath:indexPath];
UITableViewCell *cell2 = [self.tableView2 dequeueReusableCellWithIdentifier: CellIdentifier2 forIndexPath:indexPath];

//create access to details the cell will display from the core date
entity1 * e1 = [self.fetchedResultsController objectAtIndexPath:indexPath];
//this is the issue
//entity2 * e2 = [self.fetchedResultsController2 objectAtIndexPath:indexPath];

提到的问题是indexPath。如果我尝试运行应用程序,两个实体等同于它们各自的fetchedResults,则由于indexPath被重用而导致错误。如果我创建另一个indexPath,则会导致此错误(可以理解):

  

'与UITableView一起使用的索引路径无效。传递给表视图的索引路径必须包含指定节和行的两个索引。如果可能,请在UITableView.h中使用NSIndexPath上的类别。'

我的问题是,如何在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中重用或创建对NSIndexPath的单独引用,还是有解决方法?

我已经尝试在方法中使用if / if else语句,但这会在两个表中显示相同数量的单元格;如果table1有10行,则无论内容如何,​​table2中都会有10行。

以下代码可能不正确,我没有足够的经验来实现两个表视图,但这不是主要问题:

#pragma mark - Table view data source

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

    if ([self fetchedResultsController]){

        return [[self.fetchedResultsController sections] count];

    }

    if ([self fetchedResultsController2]) {
        return [[self.fetchedResultsController2 sections] count];
    }
    else{
        return 0;
    }

}

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


    if ([self fetchedResultsController]){
        id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]objectAtIndex:section];

    return [sectionInfo numberOfObjects];
    }

    if ([self fetchedResultsController2]){
        id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController2 sections]objectAtIndex:section];

        return [sectionInfo numberOfObjects];
    }
    else{
        return 0;
    }
}

2 个答案:

答案 0 :(得分:2)

首先,您不必创建两个部分。

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

然后你必须根据你的tableView

设置你的行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{


    if (tableView == self.tableView1){
        //Return the count you want inside self.tableView1
    }

    else if (tableView == self.tableView2){
        //Return the count you want inside self.tableView2
    }
    else{
        return 0;
    }
}

最后在你的cellForRowAtIndexPath里面根据你的TableView设置你的表值。

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
           if (tableView == self.tableView1){
              static NSString *CellIdentifier = @"Cell";
              //reference the cells to the right tables
UITableViewCell *cell = [self.tableView1 dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath:indexPath];
         }

    else if (tableView == self.tableView2){
               static NSString *CellIdentifier2 = @"Cell2";
               UITableViewCell *cell2 = [self.tableView2 dequeueReusableCellWithIdentifier: CellIdentifier2 forIndexPath:indexPath];
         }
    else{
        return 0;
         }
    }

答案 1 :(得分:0)

您需要为tableviews设置标记。并在cellforRowAt IndexPath

if(tabaleView.tag==100)
{
  UITableViewCell *cell = [self.tableView1 dequeueReusableCellWithIdentifier: CellIdentifier forIndexPath:indexPath]; 
}
else
{
  UITableViewCell *cell2 = [self.tableView2 dequeueReusableCellWithIdentifier: CellIdentifier2 forIndexPath:indexPath];
}