2011-04-15 40 views
0

我已經創建了一個表格視圖,並且將我的自定義uiview添加到單元格的內容視圖中。這個uiview有一個uibutton。不過,我可以在創建單元格時將uibutton添加到內容視圖中。如何使用uview和uibutton檢測Uitableview單元上的點擊?

我想獲取tableview上的tap事件來執行一些操作。我也想在uibutton上點擊活動來執行不同的操作。

問題是,當我點擊一行按鈕也被按下,並觸發兩個事件。 我怎樣才能得到這兩個事件謹慎?即點擊位於uibuttons邊界之外的單元部分被點擊時點擊tableview單元格。

+0

是你的按鈕是否完全重疊你的手機區域? – saadnib 2011-04-15 09:23:53

+0

沒有它與細胞區域不重疊。它只是右下角單元格的一部分。 – 2011-04-15 09:29:23

回答

2

可以作爲

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(13.0f, 13.0f, 90.0f, 90.0f)]; 
[button addTarget:self action:@selector(BtnPressed) forControlEvents:UIControlEventTouchUpInside]; 
[cellView.contentView addSubview:button]; 

那麼你可以得到事件分別

+0

但是,當我點擊單元格,然後按鈕也顯示爲選定。 – 2011-04-15 09:48:49

+0

是的,當你點擊一個單元格時,所有的子視圖都會顯示它們突出顯示的狀態,但它不會調用你的按鈕事件。 – saadnib 2011-04-15 09:51:30

+0

你的按鈕類型是什麼? – saadnib 2011-04-15 09:52:56

1

確定兩個不同的事件由同一個水龍頭引發細胞添加按鈕?我的理解是,UIKit只生成一個UIEvent並將其發送到層次結構中響應該類型手勢的最頂層視圖。在這種情況下,如果視圖層次結構中的按鈕較高,則它應該接收事件消息。但是,我可能是錯的。

一個解決方案,以絕對避免兩個事件的可能性被觸發,雖然可能不是理想的,將取消對的tableView行選擇,具體如下:

 self.tableView.allowsSelection = NO; 

然後,添加覆蓋視圖表格的其餘部分細節&將手勢識別器添加到該視圖。由於它們不覆蓋同一區域,因此不存在相互衝突事件的可能性。當然,要知道被點擊的行,你必須爲按鈕和新視圖添加一個實例變量來保存indexPath。當你在tableView中設置tableCell時,你可以設置索引路徑:cellForRowAtIndexPath:

希望這對你有幫助或給你一些新的想法。

+0

saadnib的解決方案更加直接。我會去那。 – 2011-04-15 11:19:08

0

你可以繼承UITableViewCell,並添加一個按鈕,下面是一個例子類:

import UIKit 

private let DWWatchlistAddSymbolCellAddSymbolButtonLeftMargin: CGFloat = 15 

class DWWatchlistAddSymbolCell: UITableViewCell { 

    private(set) var addSymbolButton:UIButton 

    init(reuseIdentifier:String?, primaryTextColor:UIColor) { 
    self.addSymbolButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton 
    super.init(style:UITableViewCellStyle.Default, reuseIdentifier:reuseIdentifier) 
    selectionStyle = UITableViewCellSelectionStyle.None 
    backgroundColor = UIColor.clearColor() 
    imageView!.image = UIImage(named:"PlusIcon")! 
    addSymbolButton.setTitle("Add Symbol", forState:UIControlState.Normal) 
    addSymbolButton.setTitleColor(primaryTextColor, forState:UIControlState.Normal) 
    addSymbolButton.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left 
    addSymbolButton.contentVerticalAlignment = UIControlContentVerticalAlignment.Center 
    contentView.addSubview(addSymbolButton) 
    } 

    required init(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
    } 

    // MARK: Layout 

    override func layoutSubviews() { 
    super.layoutSubviews() 
    addSymbolButton.frame = contentView.frame 
    let imageViewFrame = imageView!.frame 
    let imageViewMaxX = imageViewFrame.origin.x + imageViewFrame.size.width 
    let addSymbolButtonX = imageViewMaxX + DWWatchlistAddSymbolCellAddSymbolButtonLeftMargin 
    addSymbolButton.contentEdgeInsets = UIEdgeInsetsMake(0, addSymbolButtonX, 0, 0); 
    } 
} 

您可以看到 「添加符號」 按鈕,在底部:

                                                                              Add Symbol Button Cell

當你返回小區的UITableViewDataSource,確保設定的目標爲按鈕:

private func addButtonCell(tableView: UITableView) -> UITableViewCell { 
    var cell:DWWatchlistAddSymbolCell? = tableView.dequeueReusableCellWithIdentifier(kDWWatchlistViewControllerAddButtonCellReuseIdentifier) as? DWWatchlistAddSymbolCell 
    if (cell == nil) { 
    cell = DWWatchlistAddSymbolCell(reuseIdentifier:kDWWatchlistViewControllerAddButtonCellReuseIdentifier, primaryTextColor:primaryTextColor) 
    } 
    cell!.addSymbolButton.addTarget(self, 
    action:Selector("didPressAddSymbolButton"), 
    forControlEvents:UIControlEvents.TouchUpInside) 
    return cell! 
} 
相關問題