我想用数据库中的数据填充TableView,并在点击一个单元格时,在didSelectRowAtIndexPath中,将所选ID发送到新视图。
我想在单元格文本中查看记录的描述并将ID放在单元格的隐藏字段/属性中,但我找不到办法。 我知道我可以从数据源获取ID(类似于[my_data_source objectAtIndex:indexPath.row];)但我不喜欢这种方式,我更喜欢将ID分配给单个单元格。
有办法吗?
提前致谢和问候 角
答案 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
}
这里的代码只是为了演示架构