目标c - 我的UITableView中没有显示某些数组项(有些显示两次)

时间:2016-04-05 20:03:30

标签: ios objective-c uitableview

我的主视图控制器显示UITableView。 每个单元格都是自定义的(我已经为自定义演示文稿创建了UIView。)

为了在tableView中显示这些项目,我使用" allFilesFolderPath"的内容填充数组。使用此代码的文件夹:

- (void)configureView {
    _itemArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:allFilesFolderPath error:nil];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.itemArray count];
}

我创建自定义单元格以显示它们:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];
    myItem = [self.itemArray objectAtIndex:row];
    NSLog(@"My Item : %@", _itemArray.description);

    static NSString *CellIdentifer = @"cardCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifer];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifer];
    }

    return cell;
}

当我使用NSLog打印数组时,我会按字母顺序获得正确的项目列表(例如它们如何存储在我的i​​Phone上的文档位置):

My Item : (
Music,
Music10,
Music2,
Music3,
Music4,
Music5,
Music6,
Music7,
Music8,
Music9,
Photos,
Videos
)

但是当我在我的iPhone(或模拟器)中运行应用程序时,单元格会正确显示(按顺序),直到第八项。在这个数字之后,在我的情况下,而不是" Music8"," Music9","照片","视频"我回到了阵列的开头,所以" Music"," Music10"," Music2"和" Music3"

为了更好地了解我得到的内容,请点击此处截图:

enter image description here

enter image description here

我真的输了!我已经搜索过(并再次搜索)我做错了什么,但我找不到任何东西,一切对我来说都是正确的。

请帮助我找到我的问题,以便我能正常睡觉。

编辑:这是我设置为从我的其他类中检索myItem字符串的方法:

+ (NSString *)getItemName {

    return myItem;

}

以下是我从其他课程中检索它的方法:

NSString *test = [ViewController getItemName];    
_itemName.text = test;

EDIT2:这是用于设置我的自定义TableViewCell的代码 (抱歉错过了这些信息

    #import "TableViewCell.h"

@implementation TableViewCell

- (void)awakeFromNib {
    // Initialization code

    [self cardSetup];

}



- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}



- (void)cardSetup {

    _cardView.layer.masksToBounds = NO;
    _cardView.layer.shadowOffset = CGSizeMake(0, 1);
    _cardView.layer.shadowRadius = 1;
    _cardView.layer.shadowOpacity = 0.3;


    NSString *test = [ViewController getItemName];    
    _itemName.text = test;

}

@end

2 个答案:

答案 0 :(得分:3)

此呼叫名为" dequeueReusableCell ..."。表视图单元格重用。如果屏幕上有8个单元格,并且向上滚动视图,则第九行将重用第一行中使用的单元格。这就是为什么你必须在cellForRowAtIndexPath中设置你的单元格,显然你拒绝这样做。

单元格仅用于显示。它们不用于存储数据。你应该有一个数据模型,每个人都可以访问。 cellForRowAtIndexPath 从该数据模型中读取。然后,如果发生某些事情(例如,通过点击单元格中的按钮)来更改数据模型,那么您将更改数据模型,并且数据模型应该告诉所有相关方模型已更改。

一个视图中的单元格和其他地方的UILabel绝对不应该连接。任何更改都应通过您的数据模型传播。

答案 1 :(得分:2)

你在myItem的任何地方都没有使用cellForRowAtIndexPath:你的单元格似乎是从其他方法获取文字的,当它们应该从celForRowAtIndexPath:

获取时