将隐藏数据设置为 uitableview 单元格

Set hidden data to uitableview cell

我在这里和 google 上搜索了一下,但我无法真正找到我可以清楚理解的挖掘。基本上我想做的是显示名称列表,然后在单击 table 时将这些名称的 ID 及其 ID 添加到另一个数组。我目前正在研究的解决方案是基于嵌套 NSMutableArrays 但我不知道这是否是最好的做法。我认为在单元格中写另一个 "field" 是最理想的(按字段我的意思是 cell.text 之类的东西),这样我就可以存储我的隐藏值。

有办法吗?!

您可以子类化 UITableViewCell 并添加额外的 属性

@property (nonatomic, strong) NSString *hidden;

例如。那么:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    CustomUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.text = @"Name";
    cell.hidden = @"ID";
    return cell;
}

这就是您所要求的操作方法,但这似乎是一个奇怪的要求,因此您可能需要考虑一下这是否真的是实现您想要做的事情的最佳方式。虽然我不清楚你的问题你试过什么。

多面向对象思考,这会让事情变得容易很多。

创建一个名为 Person 的 class,具有两个属性:nameID。 Subclass UITableViewCell 获取 Person 的列表,将显示每个名称。单击单元格后,将每个 Person 添加到适当的位置。

这里有一个 link 教程,介绍如何子class 您或您自己的自定义 table 视图单元格: http://www.pumpmybicep.com/2014/07/21/designing-a-custom-uitableviewcell-in-interface-builder/

至于 Person class,创建一个名为 Person 的新 class NSObject 类型。在 Person.h 中添加以下内容:

@property (nonatomic) NSString *name;
@property (nonatomic) int *ID;

- (id)initWithName:(NSString *)name ID:(int)ID;

并在 Person.m 中添加以下内容:

- (id)initWithName:(NSString *)name ID:(int)ID {
    if (self = [super init]) {
        self.name = name;
        self.ID = ID;
    }
    return self;
}

现在您可以使用 Person 传输数据。

初始化:

Person *myPerson = [[Person alloc] initWithName:myName ID:1]; 

得到:

customCell.text = myPerson.name;

传输 ID:

[clickedIDs addObject:[NSNumber numberWithInt:myPerson.ID]];

你需要调整一下思路。 Cocoa 强烈遵循 MVC(模型视图控制器)设计模式,您应该学会这样思考。

在 MVC 中,模型是程序中存储数据的部分。视图是向用户显示信息并与用户交互的。

控制器是充当控制逻辑并在模型和视图之间来回馈送数据的大脑。

在UIKit中,名称中带View的对象是视图对象,名称中带控制器的对象是控制器对象。作为一般规则,模型对象由您决定,具体取决于其应用程序。

一个table视图是一个视图对象。它不存储信息,而是将信息呈现给用户 and/or 从用户那里收集信息。

数组通常是存储在 table 视图中显示的数据的最佳选择。如果您的 table 视图包含多个部分并且每个部分中有多个行而不是每个部分的数组,那么包含一个包含每行数据的数组是一个不错的选择。除非你有一个分段的 table 视图,否则请忘记它。它只会让你感到困惑。

对于只有一个部分的 "flat" table 视图,通常需要一个数组。

如何存储单元格中显示的数据是一个设计问题。一个简单的答案是对每个单元格中的数据使用字典。所以你得到了一系列字典。

如果您喜欢table 创建自定义对象,那么自定义数据存储对象会使您的代码更简洁一些。然而,您可能希望在您的数据对象中实现 NSCoding 协议,以便您可以轻松地将它们保存到磁盘。

使用数组存储单元格的数据不是一个很好的选择,因为数组使用数字索引来存储数据。您可能有要在单元格中显示的姓名、图像、员工 ID、薪水和其他一些内容。您应该为这些值使用哪些数字索引?不清楚。现在,如果你使用字典,你可以使用有意义的键:

cellData[@"name"]
cellData[@"imageName"]

或者更好的是,为您的键定义常量:

#define kNameKey @"name"
#define kImageNameKey @"imageName"

然后

cellData[kNameKey]
cellData[kImageNameKey]

这样你就不会冒险在某处输入错误的密钥字符串并引入一个你必须去弄清楚的错误。

如果您是初学者,您可能希望从一系列词典开始。使用该方法一段时间后,您可能决定迁移到自定义数据对象。

假设我们从现在开始使用字典来存储每个单元格的数据。

现在,回答你的问题。为每个单元格在字典中存储的信息多于您一次显示的信息是完全可以的。数据并没有真正隐藏,只是(还)没有显示。然后,如果用户执行的操作意味着您要公开其他数据,请告诉 table 视图重新加载该单元格。您可能希望保留有关每个单元格状态的信息数组(例如,一个布尔值,它告诉 table 视图是否应显示数据数组中每个条目的薪水信息。)当用户执行某些更改时您要显示的信息,更改显示状态数组中该索引中的适当设置,并告诉 table 视图重新加载该单元格。在您的 cellForRowAtIndexPath 方法中,您将检查显示状态数组以了解该单元格要显示的内容,然后获取适当的数据并将其安装到单元格中(并清除不应显示的字段,因为它们可能会从上次使用单元格的时间。)

如果您有一个字典数组,那么您的 cellForRowAtIndexPath 方法可能会像这样查找条目的属性:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSInteger row = indexPath.row;
  NSDictionary *rowData = dataArray[row]
  NSString *name = rowData[kNameKey];
  NSString *imageName = rowData[kImageNameKey];
}