2014-01-13 136 views
0

在我的應用程序中,我有一個表格視圖。在表視圖的每個單元格中都必須有一個按鈕,該按鈕應鏈接到單獨陣列中的對象。在故事板中,我將按鈕的標籤設置爲6(用於填充表格時的配置)。現在在tableview單元格中標記按鈕

,爲了使被添加,在tableview:cellForRowAtIndexPath按鈕之間進行區分,我改變按鈕的標記是這樣的:

[(UIButton*)[cell viewWithTag:6] setTag:1000+indexPath.row]; 

因此,一個按鈕被點擊時,我通過1000減去和知道它應該在數組中指向的索引。問題是當我做這個標記時,只有幾個按鈕被標記,其他按鈕在代碼中顯示爲空(但它們在我運行應用程序時會出現)。

這是怎麼發生的?有沒有辦法將單元格中的一組按鈕引用到數組中? 注意:我這樣做不是爲了選擇一個表格單元,我知道我可以實現它。但是我在一個單元格中有多個按鈕。

以下是調試器的圖片。 PRE意味着在標記之前,在標記單元格中的按鈕之後「添加」。正如你所看到的,前5個被標記,其他5個開始顯示爲空。請注意,所有這些按鈕都位於表格的相同部分。 enter image description here

+0

@格雷格試了一下,並沒有解決問題。 – HusseinB

+1

在任何視圖中使用'tag'永遠不是一個好主意。這聽起來像你應該使用'UITableViewCell'子類。 – Fogmeister

回答

0

你的問題是因爲細胞重用

你在細節

問題您將按鈕添加標籤爲6在您榫文件或情節串連圖板,所以當表中創建一個新的電池它設置按鈕標記爲6。然後,您可以通過使用

[cell viewWithTag:6] 

這將正常工作的第5行(或顯示在第一行,你需要滾動表之前),以獲得該單元格。

滾動表格後,表格會顯示一個「舊單元格」,該表格不再顯示以更改其屬性,但是您已經更改了該單元格中按鈕的標籤,因此您將不會能夠與標籤6拿到按鈕,該按鈕現在有標籤(1000 + X),您以前設置

解決方案

該小區創建類,並添加一個IBOutlet該按鈕,您可以使用IBOutlet這樣的單元訪問該單元

cell.button 

然後,一旦你有按鈕,然後就可以設置標籤容易

cell.button.tag = indexPath.row; 
+0

謝謝!它的工作,我應該永遠記住繼承。 – HusseinB

0

您正在使用故事板。爲什麼你用viewWithTag代替IBOutlet?故事板中的播種方便。

此外,最好是子類UIButton,添加到它的成員,將指向您的數組項目,並在按鈕點擊處理程序中使用此指針。

+0

當我將單元格中的按鈕從storyboard鏈接到.h文件 – HusseinB

+0

@ user2176995時,該應用程序無法運行並出現錯誤「無法編譯連接」,因此您需要與單元格建立連接,而不是使用tableviewcontroller。只有當它具有靜態內容時,纔可以與tableviewcontroller建立連接。 –

1

這不起作用,因爲當你調用setTag時,當視圖可見時你的單元格的標籤會被設置,但當你滾動表格視圖和單元格離開屏幕時,它將被放到可重用池中,如果單元格是再次可以看到它來自可重複使用的游泳池,並且將具有標籤6,您已在故事板中設置該標籤。 我不知道你想要達到什麼目標,但爲什麼你要設置標籤,如果你知道它總是1000 + indexPath.row? 您還應該將[cell viewWithTag:6]更改爲[cell.contentView viewWithTag:6]您將子視圖直接添加到contentView而非單元。

//擴展 如果你想知道按下了哪個按鈕,哪個單元格可以添加方法按鈕點擊事件這樣的:

- (IBAction)buttonPressed:(id)sender { 
    //Button pressed 
    UIButton *pressedButton = (UIButton*)sender; 
    // Cell on which the button was pressed 
    UITableViewCell *cell = (UITableViewCell*)[[[sender superview] superview] superview]; 
} 
+0

我這樣做是因爲我從對象數組中填充表格視圖單元格。當我點擊按鈕時,我想知道哪個單元被點擊。正如我之前所說,在一個單元中有多個按鈕,每個按鈕都引用不同的數組。因此,我標記每個按鈕並觸發時,我知道從發件人的標記它屬於哪個單元格。感謝您的輸入。 – HusseinB

+0

@ user2176995請參閱擴展的答案希望這個幫助。 – Greg

+0

是的,我確實是這樣做的,但是我正在受到可複用性的影響。我結束了UITableViewCell的子類化,併爲它添加了一個IBOutlet。無論如何謝謝你的意見。 – HusseinB

相關問題