2012-11-09 32 views
0

我使用UITableView來顯示項目列表,並且當選中一行時,我會在它旁邊的詳細視圖中顯示該項目(使用拆分視圖控制器)。如何知道我的UITableView中沒有選中行?

隨着表視圖中選擇的變化,我希望我的細節視圖也可以改變,這當然是標準的行爲,它的工作原理是完美的......除非在表視圖中不再選擇行。

例如,用戶可以從表視圖中刪除一行,在刪除期間以及刪除之後,表視圖中將沒有選定的行。當然,刪除一行後,我讓我的詳細視圖控制器知道,但在表視圖中的編輯過程中,當沒有行被選中時,我的詳細視圖控制器不知道這一點。

我試圖使用UITableViewSelectionDidChangeNotification但只有當用戶選擇不同的行時發送,而不是發生取消選擇時發送。

我該如何得知表格視圖從選中的行切換到沒有選擇的事實?

編輯:

作爲臨時的解決方案,我試圖重命名編輯按鈕來「重新排序」和只允許從A移動行到B,但不使刪除控件,但這不能被進行,因此沒有在一行上啓用編輯就沒有移動控制。事情是,我得到一個指向正在移動的行的指針,所以我可以保持選擇。我沒有得到這個指針刪除行,所以沒有去爲我。我總是想知道用戶在哪一行工作,並始終保持該行被選中。

我可能不得不放棄標準的編輯行爲,並添加我自己的按鈕和方法。或者看看什麼樣的手勢可以幫我捕捉任何一行上的觸摸......

+0

刪除是未選擇行的唯一情況? –

+0

我已經在用戶添加一個新行後捕捉到了這種情況,在這種情況下,我以編程方式選擇行並讓詳細信息視圖知道。 但是進入編輯模式或在行上滑動即可開始刪除它,取消選擇之前選擇的行,並選擇是,必須處理。 我也想選擇最近刪除的行下方或上方的行,但這是我的下一個目標,我首先需要處理表視圖的任何取消選擇狀態,並且希望有一個通知。 –

回答

0

你是如何實現刪除行的?你正在實施以下數據源方法嗎?

的tableView:commitEditingStyle:forRowAtIndexPath:

你可以有一個像

NSIndexPath * selectedIndexPath

一個屬性並將其設置爲nil一行時被刪除。

實施例:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    //select another row in your table 
    [tableView selectRowAtIndexPath:*indexPathOfTheRowToBeSelected* animated:YES scrollPosition:UITableViewScrollPositionNone]; 
    //then delete row from data source 
} 

的方法,將上述當用戶觸摸在桌子上,他的刪除按鈕被調用/她已經選擇刪除。

+0

我可以使用您的建議處理刪除操作,但我希望首先得到要刪除的滑動操作的通知,以便我可以立即選擇用戶滑過的行。標準行爲在刪除時取消選擇任何行,並且只要仍有行,我就不希望將我的表視圖保留在取消選擇狀態。 –

+0

在刪除所選行之前,您是否可以不在commitEditingStyle中選擇另一行,即表中的第一行?您可以使用UITableView的selectRowAtIndexPath選擇另一行:animated:scrollPosition: – NikosM

+0

只有當用戶確認刪除時,纔會調用commitEditingStyle,而不是當他第一次輕掃行刪除它(或按下行前的減號)時才調用。所以我沒有指向刪除的行,直到它被刪除,這對我來說太遲了。 –

2

有一個屬性indexPathForSelectedRow。我不確定當沒有選定的行時會返回什麼,但它可能會返回nil或類似的東西,您可以使用它作爲觸發器來知道是否有選定的行。類似於

if (myTable.indexPathForSelectedRow == nil) 
{ 
    //do something here to account for no rows being selected 
} 
else 
{ 
    //do stuff here to set up your detail view 
} 

讓我知道這是否適合您。

+0

謝謝,當沒有選擇行時,這個屬性確實是零,但我必須是觸發它的那個,因爲表視圖不會通知我這樣的改變。取消選擇一行對於發送通知是不夠的。 –

+0

hmm,還有一個可選的UITableViewDelegate方法'willBeginEditingRowAtIndexPath'。每次單元格被取消選擇時,該方法中的代碼都會被觸發。我不確定上面的答案中的代碼是否可以正常工作,因爲在那時我仍然選擇了單元格,但是如果您只是在用戶正在編輯表格時不想在詳細信息視圖中顯示任何內容,那麼您可以直接在代碼中清除詳細視圖。嗯......這是清楚的嗎?如果需要,我可以用示例代碼發佈新答案。 – GeneralMike

+0

編輯:每當用戶開始編輯單元格時,都會觸發'willBeginEditingRowAtIndexPath',而不是每次單元格被取消選擇。 – GeneralMike

0

好吧我誤解了你剛纔問的問題,我很確定你想要的是– tableView:willDeselectRowAtIndexPath:– tableView:didDeselectRowAtIndexPath:。這些方法將在用戶取消選擇一行時自動觸發(分別在行被取消選擇之前或之後)。在你的表視圖委託代碼中實現其中的一個,並且每當一行被取消選擇時你就會知道,並且你可以讓你的代碼選擇下一行或者任何你想要的方法。

+0

這個和其他的東西根本不工作,直到我發現我的主視圖控制器沒有明確地被告知像UITableViewDelegate一樣。它是一個'UITableViewController',所以我不認爲我必須告訴它更多,但對於某些調用,例如您的建議,它似乎有所作爲。現在我真的可以開始測試:) –

+0

當選中一行並且用戶按下另一行時,會觸發'tableView:willDeselectRowAtIndexPath:'。不幸的是,當通過在一行中滑動來進入刪除模式時,當前選擇的行被取消選擇而不調用'tableView:willDeselectRowAtIndexPath:',所以仍然沒有... –

+0

真的嗎?那完全是不直觀的。謝謝蘋果。 'didDeselectRowAtIndexPath'是否一樣? – GeneralMike

0

我也爲此而苦苦掙扎。結果是,當「編輯」按鈕被擊中時,所有行都在該點被取消選擇。您可以覆蓋setEditing:animated:來檢測它何時被點擊,但是您必須在返回之前調用[super setEditing:編輯動畫:動畫]。

請參閱此鏈接在那裏我發現這一點:

How can i identify self.editButtonItem button's clicked event?

相關問題