从TableView中的Cell获取隐藏值

时间:2010-09-28 09:36:17

标签: iphone uitableview

我想用数据库中的数据填充TableView,并在点击一个单元格时,在didSelectRowAtIndexPath中,将所选ID发送到新视图。

我想在单元格文本中查看记录的描述并将ID放在单元格的隐藏字段/属性中,但我找不到办法。 我知道我可以从数据源获取ID(类似于[my_data_source objectAtIndex:indexPath.row];)但我不喜欢这种方式,我更喜欢将ID分配给单个单元格。

有办法吗?

提前致谢和问候 角

2 个答案:

答案 0 :(得分:2)

我猜你是来自网络开发?我也发现很难这样做,但它是最好的方式。这可能是可能的 - 但如果你习惯这样做会更好,它确实是。

基本上在.h文件中定义一个NSArray(所以整个脚本都可以使用它。)

然后在init函数中:

// set the array
myArray = [NSArray arrayWithObjects:@"One",@"Two",@"Threee",nil];
[myArray retain];

然后表视图委托方法:

// set numebr of rows
- (CGFloat)tableView:(UITableView *)tableView numberOfRowsForSection:(NSUInteger)section {
  return [myArray count];
}

// set the cell titleLabel value
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  // set the cell - I can't remember the exact code then do:
  cell.textLabel.text = [myArray objectAtIndex:[indexPath row]];
}

// similarly
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  NSLog(@"%@",[myArray objectAtIndex:[indexPath row]];
}

(免责声明:这些只是我的头脑,我没有检查确切的方法 - 它们可能在某种程度上是错误的 - 但函数内部的代码是你真正想要的。)

当你开始使用它时,你会看到它比在表格中“隐藏”某个ID要好得多。为了从数据库中获取内容,我建议将它全部添加到字典,数组或类似内容中,并在初始化时将其添加到类中,但如果您真的想要动态地执行它,那么假装您的“隐藏”ID只是数组的索引。所以id#1在你的数组中的索引1处。 :)

答案 1 :(得分:1)

好吧,这是对不同方法的快速破解。我总是喜欢处理自包含的对象。将您想要的所有数据打包到表视图的自定义类(此处称为MyData)中,然后使用您需要的最小值将其初始化。您从数据库中提取的ID和文本。您还实现了一个可以从DB加载其余数据的函数。

当项目被选中时,您将对象的实例传递给子视图控制器并从数据库中填充其数据。您可以在主视图控制器或子视图控制器中触发填充,这无关紧要。

重点是将所有数据打包到一个对象中(基本上是一个“模型”,你已经拥有一个视图和控制器),然后通过访问该对象来填充视图。这样可以使您的界面在整个应用程序中保持一致。并使更改更容易。例如,如果您发现在程序开始时填写数据库中的所有数据更好,那么您现在可以在不更改其他视图的情况下执行此操作。

@interface MyObject : NSObject
{


}

// Create a stump object that contains only the necessary info
+ (id) withName:(NSString)name id:(int)id;

// loads the rest of your data from the DB
- (void) fillFromDb;

@property (readwrite, retain) NSString name;
@property (readwrite, assign) int id;
// The data fields that you need 

@end

// in tableview controller

@interface MyTableViewController ...
{
    NSMutableArray _dbData;

}


@end

@implementation MyTableViewController

- (void) viewDidLoad {
    // Load your data from DB
    for (int i =0; i < dbCount; ++i)
    {
        MyObject* data = [MyObject withName:dbName[i] id:dbId[i];
        [_dbData addObject:data];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  cell.textLabel.text = [_dbData objectAtIndex:[indexPath row]];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //Create Subviewcontroller

            // Optional call fillFromDb here and not in subviewcontroller
    subviewcontroller.dbData = [_dbData objectAtIndex:[indexPath row]];

    //activate subview
}


@interface SubViewController {
    MyObject* _dbData;
}

@end

@implementation SubViewController

- (void) viewDidLoad {
  [_dbData fillFromDb];
  // Do View Initialisations with the newly fetched Data
}

这里的代码只是为了演示架构