2012-01-31 130 views
2

我有一個應用程序組成TabBar與幾個TabBarControllers。一個控制器包含一個非常簡單的表格,它應該顯示一個NSMutableDictionary的內容。當您點擊相應的按鈕時,字典將在單獨的控制器中更新,並且視圖切換到UITableViewController,顯示新更新的表格。UITableView不刷新

我可以看到正在更新的字典。但是TableView從不反映這些變化。實際上,它似乎只在我第一次進入該屏幕時顯示更改。

我已經嘗試過[self table.reloadData],而它被調用時,更改不會反映到UITableView

有沒有人有任何建議?我很高興發佈代碼,但我不確定發佈什麼。

更新:僅在第一次顯示錶格時更新並刷新表格。隨後的顯示器只顯示原始內容。

背景: tableview從字典中獲取:appDelegate.currentFave。每次TabBarController調用ViewController時,tableview都會刷新。

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSLog(@"in viewWillAppear"); 

    [super viewWillAppear:animated]; 

    [self loadFavesFile]; 
    [self.tableView reloadData]; 
} 

// load the Favorites file from disk 
- (void) loadFavesFile 
{ 
// get location of file 
NSString *path = [self getFavesFilePath]; 

// The Favorites .plist data is different from the Affirmations in that it will never be stored in the bundle. Instead, 
// if it exists, then use it. If not, no problem. 
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { 

    // read Faves file and store it for later use... 
    NSMutableDictionary *tempDict = [NSMutableDictionary dictionaryWithContentsOfFile:path]; 
    appDelegate.sharedData.dictFaves = tempDict;  

    // grab the latest quote. Append it to the list of existing favorites 
    NSString *key = [NSString stringWithFormat:@"%d", appDelegate.sharedData.dictFaves.count + 1]; 

    NSString *newFave = [NSString stringWithFormat:@"%@", appDelegate.currentFave]; 
    [appDelegate.sharedData.dictFaves setObject:newFave forKey:key]; 

} else { 
    NSLog(@"Favorites file doesn't exist"); 
    appDelegate.sharedData.dictFaves = nil;  
} 
} 


// this gets invoked the very first call. Only once per running of the App. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// reuse or create the cell 
static NSString *cellID = @"cellId"; 
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellID]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID]; 
} 

// allow longer lines to wrap 
cell.textLabel.numberOfLines = 0; // Multiline 
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
cell.textLabel.font = [UIFont fontWithName:@"Chalkduster" size:(16)]; 
cell.textLabel.textColor = [UIColor yellowColor]; 

// NOTE: for reasons unknown, I cannot set either the cell- or table- background color. So it must be done using the Label. 

// set the text for the cell 
NSString *row = [NSString stringWithFormat:@"%d", indexPath.row + 1]; 
cell.textLabel.text = [appDelegate.sharedData.dictFaves objectForKey:row]; 
return cell;  
} 

回答

1

我發現了這個問題。我沒有正確初始化並在我的視圖控制器中分配TableView。看下面

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]  style:UITableViewStylePlain]; 

    tableView.dataSource = self; 
    tableView.delegate = self; 
    tableView.backgroundColor=[UIColor blackColor]; 
    self.view = tableView; 
} 
0

假設您提出的代碼是正確的,您想要使用[self.table reloadData]。您的.位置錯誤。

+0

我的部分錯別字。道歉。 – Bassman 2012-02-02 21:29:06

+0

這應該是一個評論,而不是答案 – 2012-02-11 23:06:44

0

昨天我也遇到了同樣的問題,對我來說,事實證明我在界面構建器中設置了錯誤的文件所有者,並沒有正確設置數據源和表視圖的委託。

嘗試進入界面生成器並右鍵單擊文件所有者,這應該會告訴您是否有任何東西沒有正確連接。

+0

我正在使用故事板,所以沒有文件所有者。但是,右鍵單擊視圖控制器顯示數據源和datadelegate都設置爲UITableView。這是正確的,對。 – Bassman 2012-02-02 21:54:53

0

你應該確保你的界面生成器連接設置正確,但什麼這個問題真的聽起來就像是,你必須在你的cellForRowAtIndexPath: UITableViewCell中設置代碼你if(cell == nil)語句中。它不應該是。讓我解釋。如果你有小區的名單,並要標題到每個單元格設置爲所謂的myArray數組中的字符串,現在你的(不正確)的代碼如下所示:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 
    if (cell == nil) { 
     // No cell to reuse => create a new one 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellIdentifier"] autorelease]; 

     [[cell textLabel] setText:[myArray objectAtIndex:[indexPath row]]]; 
    } 
    return cell; 
} 

你能看到的問題用那個邏輯?如果沒有找到可重複使用的單元格,單元格只會獲得更新的標題,在您的情況下,這聽起來就像情況一樣。 Apple表示,每次調用cellForRowAtIndexPath:時應該創建一個「新」單元,這意味着您將所有設置代碼放在if(cell == nil)檢查的之外。

繼續這個例子中,正確的代碼應該是這樣的:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 
    if (cell == nil) { 
     // No cell to reuse => create a new one 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cellIdentifier"] autorelease]; 
    } 

    [[cell textLabel] setText:[myArray objectAtIndex:[indexPath row]]]; 
    return cell; 
} 

這樣,小區被分配正確的琴絃可重複使用的電池是否被發現,因此呼籲reloadData將有期望的效果。

+0

@ Rickay我檢查了我的代碼,並根據您的建議分配了單元格。我還有其他東西嗎?我應該張貼一些代碼嗎? – Bassman 2012-02-02 21:44:36

+0

是的,你應該向我們展示有問題的代碼 – 2012-02-02 22:56:27

+0

我發佈了一些我的代碼,所以我們可以討論..... – Bassman 2012-02-03 00:52:16