如何增加.csv中的行数

时间:2013-11-18 22:14:21

标签: ios objective-c csv

我正在Xcode 5中做一个iPhone应用程序,我从.csv文件中读取了一个总统名称列表。我还从文件中读取了其他信息,例如派对和日期。

然后我在TableViewController中显示名称,当用户点击名称时,他们会在UIViewController中看到总统的详细信息。

但是,我想做一些如下的事情。想象一下,在TableViewController之前有一个UIViewController,用户可以选择仅查看例如民主党总统,然后我需要遍历.csv文件,只从.csv中读取这些文件并在TableViewController上显示它们。

我已经在我的总统行数组上尝试了for循环,但它只是继续迭代第一行(即.csv文件中的第一个总统)。

这是我尝试过的。首先,viewDidLoad从.csv文件读入(可以假设这是按照我测试过的方式工作)。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSError *outError = nil;
    NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"USPresidents"  ofType:@"csv"];

    NSString *fileString = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:&outError];
    self.importedRows = [self csvArray2PresidentsArray:[fileString csvRows]];

    // Prints a list of all the presidents - working as intended
    NSLog(@"Filestring: %@", fileString);
}

在我的cellForRowAtIndexPath中,我尝试了:

- (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];
    }

    // Configure the cell...
    President *p = (President *)[self.importedRows objectAtIndex:indexPath.row];

    for (int i = 0; i < self.importedRows.count; i++)
    {
        if ([p.party isEqualToString:@"Democratic-Republican"])
        {
            NSLog(@"President Name: %@ , President Party: %@", p.name, p.party);
            NSString *tempString;
            tempString = p.party;
            NSLog(@"TempString: %@", tempString);
            cell.textLabel.text = [NSString stringWithFormat:@"%@", tempString]; 
        }
    }
    return cell;
}

但就像我说的,当我向cellForRowAtIndexPath添加一个断点时,for()循环只是重复第一行:     self.importedRows.count

任何人都可以告诉我如何增加行,以便我可以一个接一个地遍历.csv文件中的所有行,以选出要在TaleViewContoller上显示的正确值吗?

2 个答案:

答案 0 :(得分:1)

您无法在cellForRowAtIndexPath中过滤或限制表格视图。

您应创建一个仅包含要显示的对象的过滤数组self.filteredRows(例如,在viewDidLoad中)。然后使用self.filteredRows代替 所有表格视图中的self.importedRows数据源方法。

答案 1 :(得分:1)

你只看到循环中的第一行的原因是正在检查的行(President * p)在循环开始之前被初始化。

看看for循环体内是怎么从未提到变量“i”的?这是唯一可以在循环中改变的东西。

正确的答案是接受MartinR的建议(他错误的是你不能在cellForRowAtIndexPath中过滤,但是这是一个糟糕的主意)。

@property(nonatomic, strong) NSArray *presidents;
@property(nonatomic, strong) NSString *party;

- (void)setParty:(NSString *)party {
    _party = party;
    _presidents = nil;
    [self.tableView reloadData];
}

- (NSArray *)presidents {
    if (!_presidents) {
        NSPredicate *partyPredicate = [NSPredicate predicateWithBlock:^BOOL(President *president, NSDictionary *bind) {
            return [president.party isEqualToString:self.party];
        }];
        _presidents = [self.importedRows filteredArrayUsingPredicate:partyPredicate];
    }
    return _presidents;
}

现在,只要UI设置self.party = @"Whig";,表格就会更新。让numberOfRowsInSection回答self.presidents.count并在cellForRowAtIndex路径中,使用self.presidents[indexPath.row]配置单元格。