如何获取数组Objective-C中每个项目的索引
Posted
技术标签:
【中文标题】如何获取数组Objective-C中每个项目的索引【英文标题】:How to get index of every item in an array Objective-C 【发布时间】:2011-09-07 21:02:24 【问题描述】:对于我正在开发的 iPhone 应用程序,我需要根据数组中任意项的整数来分配自定义的 uitableviewcell 图像。我注意到在做一些测试时 indexPath of row 只返回显示视图的索引,所以基本上我需要知道如何获取一个任意大小的数组,假设现在它有 10 个项目,这 10 个项目在一个表,每个项目一个单元格,我需要每个项目都有一个索引,比如项目 1 是索引 0,项目 2 是索引 1,依此类推。所以我的代码会读取,如果索引 == 0,则在单元格中显示此图像,如果索引!= 0 则显示另一个。我试过了,但就像我说的,如果我滚动到我的表格视图的底部,它会将视图顶部的任何表格项重新分配为 0,所以当我滚动图像时,图像会不断变化。所以基本上我需要帮助根据我的数组中的索引而不是表的索引来分配图像。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:MyIdentifier] autorelease];
cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.detailTextLabel.numberOfLines = 1;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
NSString *title =[[stories objectAtIndex: indexPath.row] objectForKey: @"summary"];
NSString *title2 =[[stories objectAtIndex: indexPath.row] objectForKey: @"title"];
NSString *dayOfMonthString = [title substringWithRange: NSMakeRange(2, 2)];
int dateChooser = [dayOfMonthString intValue];
NSString *monthString = [title substringWithRange: NSMakeRange(0, 2)];
int monthChooser = [monthString intValue];
cell.textLabel.text =title2;
cell.imageView.image =
[UIImage imageNamed: [NSString stringWithFormat: @"cal%d.png", dateChooser]];
if (monthChooser == 1 && (INDEX COMPARISON CODE???)
UIImageView *myImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Jan1.png"]];
[cell setBackgroundView:myImageView];
【问题讨论】:
请帮我们一个忙并发布您的代码。不是全部,只是相关的部分。 我可以推荐这篇文章吗:***.com/questions/1135075/… 那篇文章并不适用,因为无论大小,我都需要数组中每个项目的索引,而不是数组中单个对象的索引 【参考方案1】:您的问题是没有为正确的单元格获取正确的索引。 indexPath
的 row
属性 do 对应于整个单元格列表中的单元格索引,而不是仅可见单元格的索引,因此完全符合您最初的预期。 p>
我打赌你的问题是你没有正确使用 UITableViewCells 的重用机制
.
当您在 TableView 中滚动时,不再出现在屏幕上的 UITableViewCells
将被“回收”并重新用于在屏幕上显示新单元格,以避免过多的分配和无用的初始化,否则会减慢 tableView 的滚动速度。
返回单元格的正确代码模式如下:
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
// Try to retrieve a previously created cell that is not used anymore
// That's the "recycling" part, we try to reuse a cell instead of creating a new one if possible
UITableViewCell* cell = [tableView dequeueCellWithIdentifier:@"myIdentifier"];
if (cell == nil)
// We failed to recycle a previously created cell, so we have no choice to allocate a new one
cell = [[[UITableViewCell alloc] initWithStyle:... reuseIdentifier:@"myIdentifier"] autorelase];
// As we just created the cell, we configure everything that will be common to every cell
// and that won't change even if the cell is reused later when you scroll
// e.g. text color, text font, accessoryType, ...
cell.textLabel.textColor = [UIColor blueColor];
...
// Now we got here either with a brand new cell that have just been created…
// … or after reusing an old cell that were not onscreen and has been recycled
// So THIS IS THE PLACE to configure everything that is SPECIFIC to each cell
// namely cell text, especially
cell.textLabel.text = [yourDataArray objectAtIndex: indexPath.row];
return cell;
【讨论】:
我用我当前的代码更新了我的问题。不要担心日期选择器或任何东西,所有这些都有效,并且只与 if 条件之一相关。 正如我的回答中所解释的,如果您在重复使用和新分配的单元格(if (cell == nil)
之后的部分)共有的部分有条件,那么您需要考虑到您的滚动时将重复使用单元格。特别是你有一个if (monthChooser == 1 && (INDEX COMPARISON CODE???)
(当然使用 indexPath.row 进行索引比较,这不是问题,正如解释的那样!)改变你的单元格背景视图,不要忘记实现else cell.backgroundView = nil
这样当您的单元格被重复使用时,您可以恢复标准状态!
并且做将你的numberOfLines
、accessoryType
和lineBreakMode
也移动到你的if (cell == nil)
中,正如我的回答中所解释的那样!!以上是关于如何获取数组Objective-C中每个项目的索引的主要内容,如果未能解决你的问题,请参考以下文章