我正在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上显示的正确值吗?
答案 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]
配置单元格。