如何禁用UITableview单元格的用户交互,但不禁用单元格上的自定义按钮

时间:2013-07-08 09:16:23

标签: iphone objective-c uitableview

如何为UserInteraction单元格禁用UITableview但不在该单元格的自定义按钮中停用..

我正在创建一个按钮:

    UIButton *dayButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [dayButton setFrame:CGRectMake(201, 0, 30, 35)];
    [dayButton addTarget:self action:@selector(selectDayView) forControlEvents:UIControlEventTouchUpInside];
    [dayButton setBackgroundImage:[UIImage imageNamed:@"86-camera.png"] forState:UIControlStateNormal];
    dayButton.userInteractionEnabled=YES;
    [cell addSubview:dayButton];

然后我设置

    cell.userInteractionEnabled=NO;

如何获得dayButtonAction

9 个答案:

答案 0 :(得分:11)

不要禁用用户与整个单元的交互。设置cell.selectionStyle = UITableViewCellSelectionStyleNone以阻止选择单元格。这样,用户仍然可以与按钮进行交互。

答案 1 :(得分:3)

如果您设置cell.userinteraction = NO,则无法触摸该按钮,因为cellsubviews已关闭任何互动。

答案 2 :(得分:2)

一个老问题,但认为这可能对某人有所帮助。您可以通过将选择属性设置为无选择来禁用UITableView的用户交互。

Identity Inspector

答案 3 :(得分:1)

您可以设置[cell setSelectionStyle:UITableViewCellSelectionStyleNone];也不要实现tblView:didSelectRowAtIndexPath:。使您可以点击按钮(默认情况下)。处理它的事件以执行您的任务。

据我了解,如果Superview启用userintercation = no,则子视图无法进行交互。在您的情况下,UITableViewCell是超级视图,按钮是子视图。因此,最好避免设置cell.userInteractionEnabled = NO;并使用UITableViewCellSelectionStyleNone

希望这会有所帮助:)

答案 4 :(得分:1)

如果cell.userinteraction = NO,则您无法触及subviews。简单的方法就是UIViewclearColour一起使用,视图的大小与您的单元格大小相同,并将其放在单元格和上方视图中,您可以设置UIButton。当您想cell.userinteraction = NO时,只需设置view.hidden=NO,然后设置cell.userinteraction = Yes,然后设置view.hidden=YES。因此,您的透明UIView显示以及上方查看您的UIButton,然后您就可以获得点击按钮。无需设置cell.userinteraction

答案 5 :(得分:1)

还有一个选项是覆盖touchesBegan和touchesEnded。以下是:

1)制作具有覆盖功能的自定义单元格以及应用它们的指示符

class MyCustomTableViewCell: UITableViewCell { 
    var shouldDisableTouches: Bool = false

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if !shouldDisableTouches { super.touchesBegan(touches, with: event) }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if !shouldDisableTouches { super.touchesEnded(touches, with: event) }
    }
}

2)在storyboard中,将您的单元格类设置为Custom Class&gt;中的此类。类

3)现在在tableView(_:cellForRowAt :)中你可以打开或关闭交互

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier", for: indexPath) as! MyCustomTableViewCell
    if <your condition here> {
         cell.shouldDisableTouches = true
    } else {
         cell.shouldDisableTouches = false
    }
}

...&#34; else&#34;部分在这里是必不可少的,不要放弃它。毕竟它是一个可重复使用的细胞。

这种禁用不会影响按钮,这些按钮位于单独的xib中,为此单元注册。 Haven没有在一个单元格上进行测试,直接在故事板中设计。

答案 6 :(得分:0)

无法对UITableView应用禁用userInteraction,而对UITableViewCell不应用。{p>当UITableView启用userInteraction时,您可以访问UITableVie的内容/控制器(UITabelView的子视图)。当您在UITableView上添加任何控制器时实际上已将其添加到UITableViewCell,但是单元格属于UITableView,因此当您在userInteraction上停用UITableView时,这意味着它也是{为UITableViewCell设置它(NO)。

在此我还建议您将UIButton添加到单元格作为

[cell.contentView addSubView:buttonName];

答案 7 :(得分:0)

你不能在Cell上设置User Interaction Disabled,因为它是一个超级视图,在其上添加了一个按钮。如果你这样做,你将无法与按钮交互,因此禁用UITableViewCell的其余子视图上的交互。 / p>

答案 8 :(得分:0)

[快速] 对我有用的是 cell.isUserInteractionEnabled = true(我的意思是不要将其设置为false,默认为true)

并设置

cell.selectionStyle = .none