UITableView - 从两个数组切换数据

Posted

技术标签:

【中文标题】UITableView - 从两个数组切换数据【英文标题】:UITableView - switch data from two arrays 【发布时间】:2015-04-14 18:08:20 【问题描述】:

我正在开发一个应用程序,其中有一个 UITableView、两个数组和一个 UISegmentedControl。现在我需要在 UISegmentedControl 值为 0 时从数组 1 加载 UITableView 数据,当 UISegmentedControl 值为 1 时从数组 2 加载数据。简单地说,我需要切换要从数组加载到 UITableView 中的数据。我尝试使用bool,但它不起作用,我也认为它不理想。

这是我的代码:

- (void)viewDidLoad

    [super viewDidLoad];

    allTableData = [[NSMutableArray alloc] initWithObjects:
                    [[Food alloc] initWithName:@"BWM" andDescription:@"Auto" andDefinice:@"Osobni"],nil ];

    allTableData2 = [[NSMutableArray alloc] initWithObjects:
                    [[Food alloc] initWithName:@"Renault" andDescription:@"Dodavka" andDefinice:@"Velka"],nil ];



- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return 1;


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

    long rowCount;
    if(self.isSwich == false)
        rowCount = allTableData.count;
    else
        rowCount = allTableData2.count;

    return rowCount;


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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    Food* food;
    if(self.isSwitch  == false)
    
        food = [allTableData objectAtIndex:indexPath.row];
    
    else
    
        food = [allTableData2 objectAtIndex:indexPath.row];
    
    cell.textLabel.text = food.name;
    cell.detailTextLabel.text = food.description;

    return cell;

-(IBAction)switchdata:(id)sender

    if(self.myswitcher.selectedSegmentIndex == 0)
    
        isSwitch = FALSE;
    
    else
    
        isSwitch = TRUE;
    

【问题讨论】:

您能否更详细地解释一下“不起作用”部分? 数据不切换。 UITableView 显示来自一个数组的数据,但是当我单击 UISegmentedControl 时没有任何反应。 【参考方案1】:

您在witchdata: 实现中缺少对reloadData 的调用。添加此调用将解决问题。

我也觉得不太理想。

没错。与其存储一个标明要用于数据源的数组的标志,不如存储数组本身。这将消除 isSwitch 属性上的所有 ifs:

// Declare this as an instance variable, and use it
// in your data source methods.
NSArray *theSource;

- (void)viewDidLoad 
    [super viewDidLoad];

    allTableData = [[NSMutableArray alloc] initWithObjects:
                    [[Food alloc] initWithName:@"BWM" andDescription:@"Auto" andDefinice:@"Osobni"],nil ];

    allTableData2 = [[NSMutableArray alloc] initWithObjects:
                    [[Food alloc] initWithName:@"Renault" andDescription:@"Dodavka" andDefinice:@"Velka"], nil];
    theSource = allTableData;


-(IBAction)switchdata:(id)sender 
    if(self.myswitcher.selectedSegmentIndex == 0) 
        theSource = allTableData;
     else 
        theSource = allTableData2;
    
    [myTable reloadData];

或者,您可以将isSwitch 设为一个整数,并将其用作数组的索引,该数组的索引为0,allTableData 位于索引1,allTableData2 位于索引1:

NSArray *sources;
int sourceIndex;
// Use sources[sourceIndex] as the current source

- (void)viewDidLoad 
    [super viewDidLoad];

    allTableData = [[NSMutableArray alloc] initWithObjects:
                    [[Food alloc] initWithName:@"BWM" andDescription:@"Auto" andDefinice:@"Osobni"], nil];

    allTableData2 = [[NSMutableArray alloc] initWithObjects:
                    [[Food alloc] initWithName:@"Renault" andDescription:@"Dodavka" andDefinice:@"Velka"],nil ];
    sources = @[allTableData, allTableData2];
    sourceIndex = 0;


-(IBAction)switchdata:(id)sender 
    sourceIndex = self.myswitcher.selectedSegmentIndex;
    [myTable reloadData];

【讨论】:

【参考方案2】:

首先,在您的 switchData: 方法中 - 使用 self.switch 访问它的 setter、getter。

其次,不要使用布尔值来跟踪段值,而是使用直接段值。 用表视图委托、数据源方法中的 self.switcher.selectedSegmentIndex 替换您的 self.switch 值。

最后,在你的 switchData: 方法中重新加载表格视图。

【讨论】:

以上是关于UITableView - 从两个数组切换数据的主要内容,如果未能解决你的问题,请参考以下文章

iPhone UITableView 从平面数组填充可变行部分

UITableView 带有滑动切换到来自其他数组和指示器的数据

构建应用程序以在单个 UITableView 中显示两个列表的最佳方法是啥(在数据集之间切换)

切换选项卡后 UI 会随 ObservableObject 发生变化

Xcode UI 测试 - UITableView 部分

如何通过单击按钮更改 UITableView 的内容?