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

Ios 将隐藏数据设置为uitableview单元格,ios,objective-c,uitableview,cell,Ios,Objective C,Uitableview,Cell,我在这里和谷歌上搜索了一下,但我找不到我能清楚理解的挖掘。基本上,我想做的是显示一个名称列表,然后在单击表时将这些名称的ID连同它们的ID一起添加到另一个数组中。我目前正在研究的解决方案是基于嵌套的NSMutableArray,但我不知道这是否是最好的做法。我认为最好是在单元格中逐个字段写另一个字段,我指的是类似cell.text的内容,这样我就可以存储隐藏的值 有办法吗 您可以将UITableViewCell子类化并添加额外的属性 @property (nonatomic, strong) N

我在这里和谷歌上搜索了一下,但我找不到我能清楚理解的挖掘。基本上,我想做的是显示一个名称列表,然后在单击表时将这些名称的ID连同它们的ID一起添加到另一个数组中。我目前正在研究的解决方案是基于嵌套的NSMutableArray,但我不知道这是否是最好的做法。我认为最好是在单元格中逐个字段写另一个字段,我指的是类似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的类,该类有两个属性:name和ID。子类UITableViewCell获取一个Person列表,其中将显示每个名称。单击单元格时,将每个人添加到适当的位置

下面是一个关于如何为自己的自定义表格视图单元格创建子类的教程链接:

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

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

- (id)initWithName:(NSString *)name ID:(int)ID;
- (id)initWithName:(NSString *)name ID:(int)ID {
    if (self = [super init]) {
        self.name = name;
        self.ID = ID;
    }
    return self;
}
并在Person.m中添加以下内容:

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

- (id)initWithName:(NSString *)name ID:(int)ID;
- (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]; 
获取:

传输ID:

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

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

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

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

在UIKit中,名称为View的对象是View对象,名称为controller的对象是controller对象。一般来说,模型对象由您决定,具体取决于其应用程序

表视图是视图对象。它不存储信息,而是将信息呈现给用户和/或从用户处收集信息

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

对于只有一个部分的平面表格视图,通常需要单个数组

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

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

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

cellData[@"name"]
cellData[@"imageName"]
或者更好地为键定义常量:

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

这样,您就不会在某个地方错误地键入密钥字符串并引入一个您必须解决的bug

如果你是初学者,你可能想从一系列字典开始。使用这种方法一段时间后,您可能会决定迁移到自定义数据对象

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

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

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

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

现在还不清楚您在问什么:您有一个包含数据的tableview,如果某个字段被触碰,您希望将该字段的一些数据添加到数组中—问题出在哪里?我认为最好的方法是使用您需要的任何属性的自定义对象填充数组。其中一个属性是name,您可以使用类似于obj.name的内容来显示该属性,但您可以拥有任意数量的其他属性,并且可以显示也可以不显示。您不应该将数据存储在UITableViewCell中。任何数据都应该存储在数据源中。我的数据源标准布局是NSMutableDictionary对象的NSMutableArray,每行一个。可以随时轻松地将数据项添加到字典中。对于具有多个部分的TableView,我使用字典数组。请记住,单元格将从视图中删除,并在滚动视图时循环使用,因此隐藏值可能会消失,然后重新出现在其他行中。否。这根本不是个好主意。不要将数据存储在单元格中。请记住,用户可以滚动屏幕上的任何给定单元格,该单元格将被回收以显示数据中的不同条目。如果随后向后滚动,可能会使用完全不同的单元格在表中显示该索引,但有关字段隐藏状态的信息将丢失。请看我的答案,以获得更好的建议。我没有考虑到细胞被重复使用的事实:但感谢尼尔斯基尔茨的回答!是的,我也忘了。你可以只初始化单元而不重用它们,但这也不好。就像我说的,从技术上来说,你可以这样做,但我同意这不是一个好主意。基本上,我要做的是获得一个名单的身份证明。我确切地知道如何用名称填充表。我知道当我选择单元格时,我如何才能说出名称。但我不知道如何检索所选单元格的ID。我可以在数组中搜索名称,但如果有两个相同的名称呢?我明白你的意思,我唯一的问题是如何选择用于填充表的数组的对象。假设在表中,我在嵌套的NSArray中显示NSDictionary的name字段,那么如何获得通过表选择的名称的ID字段?这就是为什么我首先问这个问题的原因,对我来说,将IS数据与名称数据一起存储在同一个单元格中似乎更方便。试图在表视图单元格中存储数据是一个非常糟糕的主意。相信我。那条路通向泪水和悲伤。单元格不断被使用、回收和重用,5秒钟后,同一单元格将在数据数组中显示不同索引的数据。如果你将数据存储在一个单元格中,它最终会显示在错误的位置。如果我知道怎么做,这将是一个很好的壮举!你有任何其他提示或指南教程的链接吗?