2012-11-02 182 views
0

我定製與幾個子視圖一個UITableViewCell完成:UIButton的內部事件只發射碰了,如果在標題

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
    _mainView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 40.0f)]; 

    _hiddenOptionsView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 40.0f)]; 

    _menuView = [[CellMenuView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 20.0f)]; 

    [self addSubview:_menuView]; 
    [self addSubview:_hiddenOptionsView]; 
    [self addSubview:_mainView]; 
    } 
    return self; 
} 

CellMenuViewUIView子類,有兩個UIButtons與他們對應的目標的行動設置在初始化:

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
    UIImageView *background = [[UIImageView alloc] initWithFrame:frame]; 
    [background setImage:[UIImage imageNamed:@"cell_menu_bg.png"]]; 
    [self addSubview:background]; 

    CGFloat buttonX = frame.origin.x; 
    CGFloat buttonY = frame.origin.y + 3.0f; 
    CGFloat buttonWidth = frame.size.width/2.0f; 
    CGFloat buttonHeight = 10.0f; 

    _editButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    _editButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, buttonHeight); 
    _editButton.backgroundColor = [UIColor clearColor]; 
    _editButton.titleLabel.shadowColor = [UIColor blackColor]; 
    _editButton.titleLabel.shadowOffset = CGSizeMake(0.0f, -1.5f); 
    _editButton.titleLabel.font = [UIFont boldSystemFontOfSize:22.0f]; 
    [_editButton setTitle:@"Edit" forState:UIControlStateNormal]; 
    [_editButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
    [_editButton addTarget:self action:@selector(editButton:) forControlEvents:UIControlEventTouchUpInside]; 
    [self addSubview:_editButton]; 

    _fireButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    _fireButton.frame = CGRectMake(buttonWidth, buttonY, buttonWidth, buttonHeight); 
    _fireButton.backgroundColor = [UIColor clearColor]; 
    _fireButton.titleLabel.shadowColor = [UIColor blackColor]; 
    _fireButton.titleLabel.shadowOffset = CGSizeMake(0.0f, -1.5f); 
    _fireButton.titleLabel.font = [UIFont boldSystemFontOfSize:22.0f]; 
    [_fireButton setTitle:@"Fire" forState:UIControlStateNormal]; 
    [_fireButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
    [_fireButton addTarget:self action:@selector(fireButton:) forControlEvents:UIControlEventTouchUpInside]; 
    [self addSubview:_fireButton]; 

    return self; 
    } 
} 

我已經實現了目標操作方法,但它們沒有被執行。相反,didSelectRowAtIndexPath:優先於每次按下其中一個按鈕時觸摸按鈕內部的事件。

我已經能夠觸發按鈕上的事件的唯一方法是確保觸摸UIButton's標題中的一個字母(當然使用模擬器)。

我必須說,_menuView隱藏在其他子視圖的後面,並在單元格中的自定義附件按鈕被按下時顯示在單元格下方。它通過修改Y原點而出現,並通過再次將其設置爲0.0f而消失。

我認爲它可能與視圖層次有關,因爲過去我沒有任何問題,直接向單元添加按鈕。但我只是在這裏猜測。

如何使按鈕上的事件優先於didSelectRowAtIndexPath:方法?

謝謝!

+0

有趣。您能否包含該行的外觀截圖以及層次結構的外觀。 – WDUK

+0

我不能,現在開發是「私人」的。但是我可以編輯這個問題來添加關於層次結構的更多細節 – elitalon

回答

0

實施

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 

而對於你不想選擇的indexPath回零;這將阻止在該單元上調用didSelectRowAtIndexPath,並且(希望),您的自定義操作將被調用。

更新:自己實現這個(爲按鈕添加邊框)後,這就是我所擁有的。 enter image description here

的代碼來實現這一點(這是比你的不同),如下:

CellMenuView.m

self.backgroundColor = [UIColor blackColor]; 
    _editButton.layer.borderColor = [UIColor whiteColor].CGColor; 
    _editButton.layer.borderWidth = 2; 
    _fireButton.layer.borderColor = [UIColor whiteColor].CGColor; 
    _fireButton.layer.borderWidth = 2; 

的UITableViewCell子類

// Change in height to make it taller 
    _menuView = [[TestBtn alloc] initWithFrame:CGRectMake(0.0f, 20.0f, 320.0f, 60.0f)]; 

UITableViewController子類

self.tableView.rowHeight = 100; 

經過測試,礦山按預期工作。如果我在白色方塊內點擊,則按鈕操作按正常方式執行,並且不調用didSelectRowAtIndexPath。我只在按鈕外點擊時調用didSelectRowAtIndexPath

我認爲這裏的問題可能是你的按鈕高度/框架,以及你的行高。爲您的按鈕添加邊框,檢查其可點擊區域,並增加按鈕的高度以增加可點擊區域。

+0

問題是我想捕獲這兩個事件。當選擇一行時,應該執行一個動作,但是另一個按鈕時。 – elitalon

+0

@elitalon在'_editButton.exclusiveTouch = YES;'和'_fireButton'上做同樣的動作,就在你將它添加爲子視圖之前。這有訣竅嗎? – WDUK

+0

恐怕不是。在任何情況下,它都不能解釋爲什麼只按標題而不按下按鈕時捕獲事件 – elitalon