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

时间:2015-03-12 20:04:05

标签: ios objective-c uitableview cell

我在这里和谷歌上搜索了一下,但我真的找不到能够清楚理解的遗漏。基本上我想要做的是显示一个名称列表,然后在点击表格时将这些名称的ID添加到另一个数组,以及它们的ID。我目前正在处理的解决方案基于嵌套NSMutableArrays,但我不知道这是否是最好的事情。我认为在单元格中使用另一个“字段”进行写入是理想的(字段我的意思是cell.text),这样我就可以存储我的隐藏值。

有没有办法这样做?!

3 个答案:

答案 0 :(得分:2)

你需要调整自己的想法。 Cocoa强烈遵循MVC(模型视图控制器)设计模式,你应该学会这样思考。

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

控制器是大脑,充当控制逻辑,在模型和视图之间来回传递数据。

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

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

数组通常是存储在表视图中显示的数据的最佳选择。如果每个部分都有一个包含多个部分和多个行的表视图,而不是每个部分的数组,则包含一个包含每行数据的数组是一个不错的选择。除非你有一个分段表视图,否则忘记这一点。它会让你感到困惑。

对于" flat"只有一个部分的表视图,通常是你想要的单个数组。

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

如果您习惯于创建自定义对象,则自定义数据存储对象会使您的代码更加清晰。但是,您可能希望在数据对象中实现NSCoding协议,以便可以轻松地将它们保存到磁盘。

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

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

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

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

然后

cellData[kNameKey]
cellData[kImageNameKey]

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

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

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

现在,问你的问题。在每个单元格的字典中存储的信息比在任何时候显示的信息都要好。数据并非真正隐藏,而是(尚未)显示。然后,如果用户执行的操作意味着您要公开其他数据,请告诉表视图重新加载该单元格。您可能希望保留有关每个单元格状态的信息数组(例如,一个bool,它告诉表视图是否应显示数据数组中每个条目的工资信息。)当用户执行更改所需信息的内容时要显示,请在显示状态数组中更改该索引中的相应设置,并告诉表视图重新加载该单元格。在您的cellForRowAtIndexPath方法中,您将检查显示状态数组以显示该单元格的内容,然后获取相应的数据并将其安装到单元格中(并清除不应显示的字段,因为它们可能会遗留在上一次使用细胞。)

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

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

答案 1 :(得分:-1)

考虑更多面向对象,它会使这样的事情变得更容易。

创建一个名为Person的课程,其中包含两个属性:nameID。子类UITableViewCell获取Person的列表,将显示每个名称。单击单元格后,将每个Person添加到适当的位置。

以下是有关如何子类化您自己的自定义表格视图单元格的教程的链接: http://www.pumpmybicep.com/2014/07/21/designing-a-custom-uitableviewcell-in-interface-builder/

对于Person类,创建一个名为Person的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]];

答案 2 :(得分:-2)

您可以继承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;
}

这就是如何做你所问的问题,但这似乎是一个奇怪的请求,所以你可能想要考虑这是否真的是实现你想要做的事情的最佳方式。我从你的问题中不清楚你曾尝试过什么。