2012-01-11 67 views
7

我已經被這個難住了一段時間...彈出詳細視圖後自動取消表格視圖單元格?

當您點擊在蘋果的iPhone手機應用程序中的聯繫人的細胞(進入接觸的細節視圖),然後點擊回到以前的觀點,有一個簡短的動畫(從藍色漸變爲白色)顯示取消選擇該單元格。這是Apple自己應用程序中所有表格視圖的行爲,也是根據其人機界面指南推薦的行爲。

但是,在我自己的項目中,我一直無法複製這種行爲。從細節視圖返回時,我的UITableView中沒有任何單元格被選中。

我查看了Apple的文檔中的CoreDataBooks示例代碼,該代碼具有所需的單元格取消選擇行爲,並且似乎表視圖會自動獲取行爲(沒有任何特定的實現)。

我也試過在這些非常類似的問題落實解決:

What deselect selected cell when navigationController pops a view?

iPhone UITableView cells stay selected

UITableView doesn't keep row selected upon return

但我總是得到相同的結果 - 沒有一個細胞在我回到它時選擇了UITableView。 (後即使在視圖控制器的-viewWillAppear:方法加入[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated];。)

也有人建議在一個問題具有[[self tableView] reloadData];-viewWillAppear:可能會導致不保持選定細胞的評論。但CoreDataBooks做同樣的事情,仍然有沒有任何特定的代碼所需的行爲(看似)。

有關如何解決問題的任何建議?提前致謝。

在附註中,我不太明白爲什麼取消選擇單元的代碼應該在-viewWillAppear:(而不是-viewDidAppear:)中實現。在桌面視圖顯示在屏幕上之前,這不會導致所有事情發生嗎?這可能只是由於我對視圖的生命週期缺乏正確的理解,但任何澄清都會很好。再次感謝。

+0

爲了防萬一,我使用Xcode 4.2和iPhone 5.0模擬器。我的項目使用ARC。 – James 2012-01-11 17:26:24

+0

從viewWillAppear調用deselction方法時,您是否調試過indexpath的值?當時是什麼? – rishi 2012-01-11 17:40:53

+1

不知道我是否正確做到了這一點,但我試着記錄'indexPathForSelectedRow'的返回值,並且段和行都是「(null)」。 – James 2012-01-11 18:00:06

回答

2

你有沒有嘗試過使用UITableViewController的clearsSelectionOnViewWillAppear屬性(不僅僅是一個tableview,而是一個tableviewcontroller)?如果將其設置爲NO,則會使選擇保持藍色。
爲了得到您想要的效果,您可能還需要添加一個電話以便確保它不會永遠保持藍色,您需要添加一個電話到
- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated

查看UITableView Documentation的概覽部分以開始使用。

//編輯// 正如以下評論所述,我們最終做的是將電話轉到[[self tableview] reloadData];viewDidAppear
我的猜測是,CoreDataBooks有足夠複雜的表格(包括章節和書籍以及章節和書籍),表明事件的時間正在發生變化。

+0

最初,在'-viewWillAppear:'我只有'[super viewWillAppear:animated];'''[self tableView] reloadData;''。我玩過添加'[self setClearsSelectionOnViewWillAppear:NO];'並刪除'[[self tableView] reloadData];'。似乎問題是'reloadData'在顯示錶視圖之前清除單元格選擇。當我刪除它時,單元格取消選擇似乎表現得很好,但是我需要'reloadData',以便顯示新添加的單元格(在解除添加它們的模式視圖控制器時)。 – James 2012-01-12 02:08:04

+0

將'clearsSelectionOnViewWillAppear'設置爲'NO'時,只有當'reloadData'也被刪除時(以前選擇的單元格,可預測地停留在高亮顯示的狀態下)纔會產生明顯差異,因此與當前問題無關。 – James 2012-01-12 02:15:47

+0

這將是非常hacky,但你可以延遲調用'reloadData'。像'[[self tableView] performSelector:@selector(reloadData)withObject:nil afterDelay:0.2];''。我不知道它是否會起作用。 – Walter 2012-01-12 10:28:03

1

如果要取消選擇一個單元格,請使用- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated並使用[self.tableView deselectRowAtIndexPath:indexPath animated:YES];[tableView deselectRowAtIndexPath:indexPath animated:YES];

+0

請閱讀問題和評論。你提出的答案已經成爲問題的一部分。感謝您試圖幫助。 – James 2012-01-12 16:31:56

+0

我之所以這樣回答,是因爲如果將'tableView'更改爲'self.tableView',它有時會起作用。 – Souljacker 2012-01-12 16:58:22

+0

我已經試過了,但是謝謝。 – James 2012-01-13 08:32:08

相關問題