2013-10-12 64 views
0

我有一個自定義單元格的表格。每個單元格包含一個您按下的按鈕,提示警報。更新UITableViewCell基於按下警報視圖按鈕

警報按預期使用UIAlertView委託,並檢查按鈕的標題以確定用戶按下的內容。這又會調用提交數據的Web服務。提交完成後,我需要將該單元中的按鈕更改爲另一個按鈕圖像。

重新加載數據,以便它反映發送到服務器的更新,然後重新加載tableview是沒有效果的。

有沒有辦法訪問cellForRowAtIndexPath之外的單元格?我有它設置一個全局變量名爲selectedIndex基於我按什麼按鈕,但這是盡我所能。以這種方式訪問​​一個單元格是否合理(或者是一個好主意)?

感謝您的幫助!

+0

澄清:這聽起來像你遇到的問題是你的按鈕沒有改變?你在每個單元格中使用UIButton嗎?你可以發佈你的實現代碼嗎? – zeantsoi

回答

0

有很多方法可以重新加載tableview中的數據。但是對於你的情況,如果你可以獲得對單元格的引用,那麼只需做一些與UI無關的更改(改變圖像或類似的東西)就足夠了。

如果您認爲在Web服務返回響應後表格的內容大小會發生變化,那麼您必須重新加載表格。當然,你可以重新加載整個表格的內容,或者只是幾行或幾部分。請查看官方documentations瞭解詳細信息

全局變量不是獲取按下按鈕的單元格索引的好方法。如果您使用按鈕的tag屬性,更好的方法是。使用indexPath的行(或任何模式所在的部分)設置按鈕的標記。然後你可以在按鈕的選擇器方法中獲取tag

Web服務調用完成時獲取單元的引用,通過indexPathForRow:inSection:獲取NSIndexPath的實例。

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:0]; 

檢查單元格是否仍然可見並繼續前進。

MyCustomCell *cell = (MyCustomCell *)[self.tblView cellForRowAtIndexPath:indexPath]; 

並在那裏做那個單元格的更改。

+0

正是我在找的東西,像魅力一樣工作! –

0

UITableView有一個名爲-cellForRowAtIndexPath:的方法(不是委託方法)。如果單元格仍然可見,並且已經存儲索引路徑,則可以使用它來獲取單元格。如果單元格不可見,它將返回nil(但在這種情況下,稍後將調用委託方法以在該索引路徑變爲可見之前再次爲該索引路徑提供單元格,因此您可以對其進行配置)。

需要注意的是,Web服務調用大概是異步的,當用戶按下按鈕並獲得Web響應時,許多事情可能會發生變化。用戶可以將屏幕上的單元格滾動到不在屏幕上的位置,在這種情況下,您需要以某種方式存儲更新的值,以便稍後可以正確配置單元格。另外,如果你的代碼出於任何原因調用了reloadData,那麼即使保留NSIndexPath也沒有任何意義 - 如果你的底層模型完全改變了,那麼與用戶點擊相關的模型記錄現在可能處於完全不同的NSIndexPath中(或可能根本不存在於數據集中)。根據您的情況,這些可能會也可能不是問題,但如果是,最好保留對所選記錄(或該記錄的主鍵)的引用,並且當該回調返回時,確定什麼現在該記錄的索引路徑是,並查看該索引路徑的單元格是否可見。

最後,我建議使用視圖控制器的屬性來存儲這些值,而不是全局值。如果您創建了視圖控制器的新實例,並且您基於全局變量的值更改了行爲,則仍可能從該視圖控制器類的以前用法中設置(具有完全不正確的值)。