2010-09-28 108 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 
} 

的代碼是在這裏只是爲了演示架構