我有一个索引tableView
,显示用户iPod库中的歌曲列表。这就是我目前获得歌曲标题的方式,这会导致滚动非常慢:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.textLabel.text= [self titleForRow:indexPath]; //getting cell content
}
...调用这些方法:
-(NSString *)titleForRow:(NSIndexPath *)indexpath{
NSMutableArray* rowArray=[[NSMutableArray alloc]initWithCapacity:0];
rowArray=[self getArrayOfRowsForSection:indexpath.section];
NSString *titleToBeDisplayed=[rowArray objectAtIndex:indexpath.row];
return titleToBeDisplayed;
}
-(NSMutableArray *)getArrayOfRowsForSection:(NSInteger)section
{
NSString *rowTitle;
NSString *sectionTitle;
NSMutableArray *rowContainer=[[NSMutableArray alloc]initWithCapacity:0];
for (int i=0; i<self.alphabetArray.count; i++)
{
if (section==i) // check for right section
{
sectionTitle= [self.alphabetArray objectAtIndex:i]; //getting section title
for (MPMediaItem *song in songs)
{
NSString *title = [song valueForProperty:MPMediaItemPropertyTitle];
rowTitle= [title substringToIndex:1]; //modifying the statement to its first alphabet
if ([rowTitle isEqualToString:sectionTitle]) //checking if modified statement is same as section title
{
[rowContainer addObject:title]; //adding the row contents of a particular section in array
}
}
}
}
return rowContainer;
}
问题是:对于每个cellForRowAtIndexPath
,我调用这些方法并为每个单元格创建这些数组。所以我需要创建一个单独的数组,只需从该数组中调用objectAtIndex
。
这是我到目前为止所尝试的:创建了NSMutableArray *newArray
,以及以下方法:
-(NSMutableArray *)getNewArray:(NSInteger)section
{
NSString *rowTitle;
NSString *sectionTitle;
for (int i=0; i<self.alphabetArray.count; i++)
{
if (section==i) // check for right section
{
sectionTitle= [self.alphabetArray objectAtIndex:i]; //getting section title
for (MPMediaItem *song in songs)
{
NSString *title = [song valueForProperty:MPMediaItemPropertyTitle];
rowTitle= [title substringToIndex:1]; //modifying the statement to its first alphabet
if ([rowTitle isEqualToString:sectionTitle]) //checking if modified statement is same as section title
{
[newArray addObject:title]; //adding the row contents of a particular section in array
}
}
}
}
return newArray;
}
但这似乎非常错误,我真的很困惑如何解决这个问题。我不知道如何用这些方法创建一个单独的数组,用歌曲标题填充newArray
,我已经搜索了Google很长一段时间了,我找不到任何有用的东西我。
有人可以指出我正确的方向,或者请告诉我我是如何创建newArray的? I've attached my tableView data source here。谢谢。任何帮助将不胜感激。
答案 0 :(得分:0)
这一切的中心是:
cell.textLabel.text = [self titleForRow:indexPath];
现在,您实际使用的是NSString
。简单。相反,你是为每个调用每个单元格创建一个新数组?
为什么不拥有一个数组,比如一个NSMutableArray。将它作为@property
或本地iVar。
@property (strong, nonatomic) NSMutableArray *rowArray;
// Instantiate in -viewDidLoad
rowArray = [NSMutableArray array]; // Much more elegant IMHO
现在调用一个方法来执行所有内容加载,但是执行 ONCE 。您可以随时再次调用它来刷新。
类似的东西:
// In -viewDidLoad
rowArray = [NSMutableArray array];
[self loadArrayContent];
然后,您的cellForRowAtIndexPath
应该只使用预先加载的rowArray
,只需从中提取NSString
个标题。
答案 1 :(得分:0)
我处理表视图的一般方法是创建(在表视图设置期间)行的NSMutableArray(锚定在数据源对象中)。数组中的每个条目都是一个NSMutableDictionary,它使用该行的基本内容进行“准备”,如果需要开发更多信息来显示该行,则将其缓存在字典中。 (在有多个部分的情况下,我使用包含行数组的部分数组。)
我可能为播放列表做的是用空字典初始化数组,然后,在滚动时,访问每个播放列表元素并将其缓存在字典中。
事实上,如果真的想要,可以通过后台任务(具有适当的锁定)来更新字典,这样查找操作就不会妨碍滚动速度。
答案 2 :(得分:0)
表视图单元格以串行方式排队并出列。利用这种能力,你应该期望只有部分变化的频率更低。您可以使用静态变量来免除提取节。看看我的代码
-(NSString *)titleForRow:(NSIndexPath *)indexpath{
static NSIndexPath *funIndexPath;
static NSMutableArray *funSectionArray;
if (!funIndexPath || funIdexpath.section != indexpath.section) {
funIndexPath = indexpath;
funSectionArray = [self getArrayOfRowsForSection:indexpath.section];
}
rowArray = funSectionArray;
NSString *titleToBeDisplayed = [rowArray objectAtIndex:indexpath.row];
return titleToBeDisplayed;
}
这是第一次可能的优化。
当我查看你的抓取结果数组时,有些事情并不清楚。你为什么要迭代检查section == i
。您只需在代码中替换section
i
即可。
-(NSMutableArray *)getNewArray:(NSInteger)section {
NSString *rowTitle;
NSString *sectionTitle;
sectionTitle = [self.alphabetArray objectAtIndex:section]; //getting section title
for (MPMediaItem *song in songs) {
NSString *title = [song valueForProperty:MPMediaItemPropertyTitle];
rowTitle= [title substringToIndex:1]; //modifying the statement to its first alphabet
if ([rowTitle isEqualToString:sectionTitle]) //checking if modified statement is same as section title
{
[newArray addObject:title]; //adding the row contents of a particular section in array
}
}
return newArray;
}
目前还不清楚你想在这里实现什么。
反对我自己的回答,我建议您在视图渲染时间内不计算要显示的数据。您需要尽快创建单元格。为什么不创建属性或iVar(如@bauerMusic是Suggesting)并在viewDidLoad
中计算日期或声明自定义函数,该函数将重新加载您的属性(可能是Array
或Dictionary
)在渲染UI时,只需设置值(在viewForIndexPath
中)?
您可以使用两级深度的数组来存储以维护节和行。即第1级 - 部分和行数组,第2级 - 行。