如何自定义cellForRowAtIndexPath TableView方法以根据所采取的操作显示来自不同来源的数据?

时间:2014-01-13 12:40:42

标签: ios objective-c uitableview

我基本上有两个数组,我想一次在TableView中显示一个数组:

@property (nonatomic, strong) NSArray *items;
@property (nonatomic, strong) NSArray *historicItems;

itemshistoricItems应显示在TableView中,具体取决于所采取的操作。

选择要显示的数组的正确方法是什么?要在TableView中显示的单元格是使用cellForRowAtIndexPath:indexPath方法准备的。

5 个答案:

答案 0 :(得分:2)

在您的课程中添加BOOL,并在您的操作中将其设置为true或false,

//define in your .h or wherever you want to declare

BOOL flag;

并且要么在你的行动中使其成为真或假。而不是CellForRowAtIndexPath根据你的行动选择数据源。

If (flag){
cell.textLabel.text=[items objectAtIndex:IndexPath.row];
}
else{
cell.textLabel.text=[historicalItems objectAtIndexPath.row];
}

并且您还必须使用相同的if else语句在numberofcell函数中返回来自这两个数据源的单元格数。

答案 1 :(得分:2)

您可以添加bool变量并根据所采取的操作进行更改。在表视图中,数据源方法根据bool变量执行填充,例如:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (action == YES) //your first action 
        return items.count;
    else //second action
        return historicItems.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Your code to init cell here
    .......
    if (action == YES) //your first action 
    {
        cell.textLabel.text = items[indexPath.row];
    }
    else //second action
    {
        cell.textLabel.text = historicItems[indexPath.row];
    }

    return cell;
}

希望这个帮助

答案 2 :(得分:2)

这样做:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        if (showItems)
        {
            return items.count;
        }
        else
        {
            return historicItems.count;
        }
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *CellIdentifier = @"cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) 
        {
             cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
        }
        if (showItems)
        {
            cell.textLabel.text = [items objectAtIndex:indexPath.row];
        }
        else
        {
            cell.textLabel.text = [historicItems objectAtIndex:indexPath.row];
        }
        return cell;
    }

答案 3 :(得分:2)

取决于您可以选择使用所需项目重新加载tableview的操作。使用任何布尔变量来跟踪选择的动作。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger count;
    if (isItems == YES) //your first action 
        count = items.count;
    else {
         count = historicItems.count;
    }

    return count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   UITableViewCell *cell = dequeueReusableCellWithIdentifier:@"Cell"];

    if (isItems == YES)  
    {
        cell.textLabel.text = items[indexPath.row];
    }
    else 
    {
        cell.textLabel.text = historicItems[indexPath.row];
    }

    return cell;
}

答案 4 :(得分:1)

第一种方式 如果两个数组包含的相同,则采用datasourcearray。然后copy将适当的数组数据放入按钮操作的datasourcearray中。

datasourcearray = [self.items copy];
[yourtable reloadData];

onther数组的类似操作。

第二路 如果两个数组包含不同,则取一个布尔值(假设为isFirstSenarioFlag) 按下按钮时切换值YES或NO。检查每个数据源中的标志值和委托方法,并在重新加载数据方法后加载表的相应数据。

首先,您不需要在每个表数据源和委托方法中检查设置标志值aur检查数据源。此外,它还可以减少程序的运行时间复杂性(切换每个方法),也便于管理内存。 :)