使用其他方法为cellForRowAtIndexPath创建数组

时间:2014-06-29 01:34:13

标签: ios objective-c arrays uitableview

我有一个索引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。谢谢。任何帮助将不胜感激。

3 个答案:

答案 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中计算日期或声明自定义函数,该函数将重新加载您的属性(可能是ArrayDictionary)在渲染UI时,只需设置值(在viewForIndexPath中)?

您可以使用两级深度的数组来存储以维护节和行。即第1级 - 部分和行数组,第2级 - 行。