【问题标题】:Objective c - Some array items are not shown in my UITableView (some shown twice)目标 c - 我的 UITableView 中未显示某些数组项(有些显示两次)
【发布时间】:2016-04-05 20:03:30
【问题描述】:

我的主视图控制器显示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 打印数组时,我得到了正确的项目列表并按字母顺序排列(就像它们在我的 iPhone 上的文档位置中的存储方式一样):

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

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

为了更好地理解我得到了什么,这里是截图:

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

请帮我找出我的问题,以便我可以正常睡觉。

编辑:这是我设置的从其他类中检索 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

【问题讨论】:

    标签: ios objective-c uitableview


    【解决方案1】:

    有一个名为“dequeueReusableCell...”的调用。表格视图单元被重用。如果屏幕上适合 8 个单元格,并且您向上滚动视图,则您的第九行将重用用于第一行的单元格。这就是为什么您必须在 cellForRowAtIndexPath 中设置您的单元格,显然您拒绝这样做。

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

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

    【讨论】:

    • 我没有想过使用类来存储数据,我不认为为什么,因为它是一个干净的模型!我明天会试试这个,因为我住的地方已经很晚了,让你知道。谢谢!
    • 所以我在 ray wenderlich tuto (raywenderlich.com/1797/…) 的帮助下创建了我的数据模型。我已经设置了一个包含我的标题的 Doc 和一个 Data 类。我已经成功创建了我的 TableViewCellDoc 项目,但是当我在 cellForRowAtIndexPath 中将它发送到我的单元格对象时,标签内什么也没有。请参阅我用于发送它的代码: TableViewCellDoc *item = [self.itemArray objectAtIndex:indexPath.row]; TableViewCell *cellItem = [[TableViewCell alloc] init]; cellItem.itemName.text = item.data.title;
    • 嗯,我找到了问题,它来自我在 cellForRowAtIndexPath 中的单元格的初始化。我曾经像 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cardCell"];而不是 TableViewCell(我的自定义类)**cell = [tableView dequeueReusableCellWithIdentifier:@"cardCell"];。我现在可以通过委托方法打印所有项目,谢谢:)
    【解决方案2】:

    您没有在cellForRowAtIndexPath: 中的任何地方使用myItem 您的单元格似乎正在从其他方法获取文本,而它们应该从celForRowAtIndexPath: 获取文本

    【讨论】:

    • 请看我编辑的问题,我已经添加了我用来从我的其他类中检索 myItem 字符串的方法
    • @Synny,你提到了一个你还没有发布的awakeFromNib 方法。
    • @Synny,你的+ (NSString *)getItemName 方法是一个类方法,所以它里面的myItem 只是一个实例,可能被许多不同的单元格访问。相反,在cellForRowAtIndexPath 中使用[self.itemArray objectAtIndex:row] 来设置文本。如果需要,请将其转发给其他实例方法。但是你不应该将类方法用于这样的事情。
    • @Gavin 再次编辑我的问题以发布代码 Hash88 好的,我将在接下来的几分钟内尝试这种方式
    猜你喜欢
    • 2019-10-29
    • 1970-01-01
    • 2017-10-04
    • 2018-09-06
    • 1970-01-01
    • 2022-06-13
    • 2021-02-09
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多