2012-07-03 53 views
1

我有一個有趣的場景。 我有一個包含一個按鈕的自定義TableViewCell類。 我想要做的是捕獲自定義單元類中按鈕的觸摸事件,併爲容器控件(ler)處理一個新事件。攔截UIEvents並將它們傳遞給父元素

這樣做的原因是我有一個帶有標記爲「存檔」按鈕的單元格。現在,我不想處理自定義TableViewController中的單元代碼,因爲我需要隱藏存檔按鈕,並告訴容器控件(或TableViewController)處理「單元格X中發生的存檔事件」,所以我想先截取按鈕調用。 我不想讓控制器知道單元格內部發生了什麼。這樣我有一些可重用和更乾淨的代碼。

因此,控制器應該能夠接收事件並形成事件來確定涉及哪個單元以便知道它需要刪除哪個記錄。 我可以通過NSNotificationCenter類實現這一點,並且讓觀察者爲我處理它,但如果我可以將它作爲事件引發,它將會很棒(我認爲,不知道是否會同意)。

這可以通過iOS開發完成嗎?

我希望我的問題有道理。

謝謝

編輯:看來我被誤解了。所以讓我說清楚(除非完全不可能),我不希望TableViewController知道單元格內的按鈕。控制器需要接收由單元生成的事件,因爲它捕獲了原始按鈕觸摸事件,並且在單元內部需要生成控制器可以捕獲的新事件。類似於你在.NET世界中可以做的事情。 但是,如果這不能完成請讓我知道。原因是清潔和可重用的代碼。

回答

0

除非有人能告訴我一個更好的辦法,我用這個方法去。

假設你有一個TableViewController:

@interface CustomViewController : UITableViewController<ArchiveItemDelegate> ... 

,你有一個自定義TableViewCell:

@interface CustomCell : UITableViewCell ... 

使用下面的委託協議,委託財產。

現在我已經創建了一個協議:

@protocol ArchiveItemDelegate <NSObject> 

-(void)archiveActionPerformed:(CustomCellData *)cellData onCell:(CustomCell *)cell; 

@end 

裏面我CustomCell執行我附加一個事件監聽器上的歸檔按鈕:

- (void)archiveButtonPressed:(UIButton *) sender forEvent:(UIEvent *)event { 
    [self.delegate archiveActionPerformed:currentCellData onCell:self]; 
} 

現在在我的TableViewController我讓它「繼承」從ArchiveItemDelegate協議並實施它。

-(void)archiveActionPerformed:(CustomCellData *)cellData onCell:(CustomCell *)cell { 
    // do whatever ... 
} 

現在,在我的 「的tableView:(UITableView的*)的tableView的cellForRowAtIndexPath:(NSIndexPath *)indexPath」 方法我只是附加TableViewController的細胞。現在

cell.delegate = self; 

我TableViewController不知道單元的內部和「存檔事件」的小區通知時存檔按鈕被竊聽。這可能會「演變」一點,但現在我認爲會有所作爲。如果有人有更好的解決方案,請讓我知道。你可以看到我來自.NET空間;-)

1

當您創建自定義表格視圖單元格時,可以將回調附加到按鈕按下事件。現在,您可以將索引作爲按鈕的標記傳遞,從您的uitableview控制器的數據源中刪除項目。

重新加載tableview,你很好去。

希望這可以幫助你。

myCell.archiveButton.tag = indexPath.row ; // This is the index in your data source 

[myCell.archiveButton addTarget:self action:@selector(archiveItems:) forControlEvents: UIControlEventTouchUpInside]; 

void archiveItems:(id)sender { 
    int index = sender.tag; 
// Remove the item from your data source 

[self.myTableview reloadData]; 

} 
+0

如果我正確理解你,你是否建議我使用一個委託,以便該按鈕被點擊時單元調用TableViewController? –

+0

立即檢查我的編輯。 –

+0

我不確定我的問題是否足夠清晰,因爲我不希望控制器知道單元內部發生的事情,它甚至不應該意識到該按鈕。我所希望的是控制器接收單元內部產生的事件,因爲單元捕獲了按鈕觸摸,然後將其引發給控制器。如果這是不可能的,請讓我知道,因爲我可以根據你的回覆做一些其他的事情,這給了我一個想法。 –

0

是的,你可以做。

首先,您必須將位置設置爲該按鈕的標記。然後你將你的ViewController設置爲Button的目標,並調用這樣的選擇器方法。

[yourCustomCell.yourButton setTag:indexPath.row];//set position as tag to remember the position 
[yourCustomCell.yourButton addTarget:self action:@selector(doArchive:) forControlEvents:UIControlEventTouchUpInside]; 

,然後在你的doArchive方法,取得標記,這實際上是這樣的位置:

- (void)doArchive:(id)sender 
{  
    int positon = sender.tag; 
    // do something with positon and get the data from your Array at that position 
} 
相關問題