2010-09-28 87 views
1

我想用数据库中的数据填充TableView,当点击一个单元格时,在didSelectRowAtIndexPath中发送选定的ID到一个新的View。从TableView中获取隐藏值CellView

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

有没有办法做到这一点?

在此先感谢和问候 c。

回答

2

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

基本上在.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处。 :)

+0

非常感谢你,我已经按照你的指示和它就像你说我来自网络的发展,发现它有点跑:-)奇怪.... – Cris 2010-09-28 10:07:32

+0

是的,但很快你会意识到,如果网络以iphone的方式工作,世界将是一个更好的地方! :p哈哈 – 2010-09-28 11:04:35

1

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

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

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

@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 
} 

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