已经搜索了一些可能的修复,但都没有解决我的问题。
我一直点击uitableview中的单元格,而不是单击其中的按钮。
这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.backgroundColor = [UIColor blackColor];
UIView *v = nil;
NSArray *array = [cell subviews];
for (v in array) {
NSLog(@"%@",[v class]);
if( [v isKindOfClass:[UIView class]] ){
[v removeFromSuperview];
}
}
//tb
if (tableView == self.tb) {
v = [[UIView alloc] initWithFrame: CGRectMake(0, 0, self.tb.bounds.size.width, 120.0)];
if([feeds count]>0){
UIImageView *box=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"statusBox.png"]];
box.userInteractionEnabled = YES;
[v addSubview:box];
AsyncImageView *imageView1 = [[AsyncImageView alloc] initWithFrame:CGRectMake(10, 20.0f, 34.0f, 34.0f)];
imageView1.contentMode = UIViewContentModeScaleAspectFill;
imageView1.clipsToBounds = YES;
//cancel loading previous image for cell
[[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:imageView1];
if (users1 != nil && users1.imagelink != nil && (id) users1.imagelink != [NSNull null]){
imageView1.imageURL = [NSURL URLWithString:users1.imagelink];
}
else{
imageView1.image=[UIImage imageNamed:@"default_ProfilePic.png"];
}
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myFunction:)];
tapped.numberOfTapsRequired = 1;
[imageView1 addGestureRecognizer:tapped];
[tapped release];
imageView1.userInteractionEnabled = NO;
[v addSubview:imageView1];
UIFont *font = [UIFont fontWithName:@"TrebuchetMS-Bold" size:11];
UILabel *descLabel1 = [[UILabel alloc] initWithFrame: CGRectMake(52, 23, 160, 48)];
descLabel1.text = [NSString stringWithFormat:@"%@ %@",users1.userfirstn,users1.userlastn];
descLabel1.textColor = [UIColor blackColor];
descLabel1.font = font;
descLabel1.adjustsFontSizeToFitWidth=YES;
descLabel1.numberOfLines = 0;
CGSize expectedLabelSize = [descLabel1.text sizeWithFont:descLabel1.font
constrainedToSize:descLabel1.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGRect newFrame = descLabel1.frame;
newFrame.size.height = expectedLabelSize.height;
descLabel1.frame = newFrame;
descLabel1.numberOfLines = 0;
descLabel1.userInteractionEnabled = NO;
[v addSubview:descLabel1];
UILabel *descLabel2= [[UILabel alloc] initWithFrame: CGRectMake(52, 43, 200, 48)];
StatusClass *stat1=[feeds objectAtIndex:indexPath.row];
descLabel2.text = [stat1 statcreate];
descLabel2.textColor = [UIColor blackColor];
descLabel2.font = font;
descLabel2.adjustsFontSizeToFitWidth=YES;
descLabel2.numberOfLines = 0;
CGSize expectedLabelSize2 = [descLabel2.text sizeWithFont:descLabel2.font
constrainedToSize:descLabel2.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGRect newFrame2 = descLabel2.frame;
newFrame2.size.height = expectedLabelSize2.height;
descLabel2.frame = newFrame2;
descLabel2.numberOfLines = 0;
descLabel2.userInteractionEnabled = NO;
[v addSubview:descLabel2];
UILabel *descLabel3= [[UILabel alloc] initWithFrame: CGRectMake(10, 63, 280, 80)];
StatusClass *stat=[feeds objectAtIndex:indexPath.row];
descLabel3.text = [stat stattext];
descLabel3.textColor = [UIColor blackColor];
descLabel3.font = font;
descLabel3.adjustsFontSizeToFitWidth=YES;
descLabel3.numberOfLines = 0;
descLabel3.userInteractionEnabled = NO;
[v addSubview:descLabel3];
//comment button
UIButton *buttonC = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[buttonC addTarget:self action:@selector(sendComment:) forControlEvents:UIControlEventTouchUpInside];
[buttonC setImage:[UIImage imageNamed:@"comment.png"] forState:UIControlStateNormal];
buttonC.frame = CGRectMake(2, 160, 145, 35);
buttonC.userInteractionEnabled = YES;
[v addSubview:buttonC];
//share button
UIButton *buttonS = [UIButton buttonWithType:UIButtonTypeRoundedRect];
buttonS.tag = indexPath.row;
[buttonS addTarget:self action:@selector(sendShare:) forControlEvents:UIControlEventTouchUpInside];
[buttonS setImage:[UIImage imageNamed:@"share.png"] forState:UIControlStateNormal];
buttonS.frame = CGRectMake(150, 160, 140, 35);
buttonS.userInteractionEnabled = YES;
[v addSubview:buttonS];
}
v.userInteractionEnabled = YES;
[cell addSubview:v];
}
return cell;
}
我还尝试使用UITapGestureRecognizer
按钮,但仍无效。
感谢。
答案 0 :(得分:23)
我对这个问题感到困惑......
我设法通过在一个项目上执行此操作来解决此问题:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("RegCell", forIndexPath: indexPath) as! CustomCell
cell.contentView.userInteractionEnabled = false // <<-- the solution
return cell
}
但同样不适用于不同的项目。我不知道为什么......
答案 1 :(得分:22)
还有另一个可能导致此类问题的原因,那就是UITableViewCells
现在有一个contentView
。这可以并且将被放置在自定义表格视图单元格中的其他视图之前,以便拾取触摸并检测单元格选择。这样做可能会阻止其后面的任何视图的触摸。在使用笔尖创建单元格时,我特别注意到这种烦恼。
接受处理的方法是确保所有子视图不是添加到tableview单元本身,而是添加到contentView
。这是一个只读属性,可在某些情况下调整自己的帧,例如,当侧向滑动以显示删除按钮时,或在编辑模式期间。因此,您应确保添加到contentView
的任何项目都具有智能大小并具有正确的调整大小行为。
另请注意,通过向contentView
添加单元格,您可以自己阻止对其的触摸,从而阻止选择单元格。我个人尝试不允许在包含具有自定义用户启用控件的单元格的tableviews中选择单元格。它只会导致混乱和尴尬的界面。事实上,我正在认真考虑用UITableViews
替换我未来项目中的所有UICollectionViews
,这些项目的适应性更强。
-Ash
答案 2 :(得分:5)
在我的情况下,我尝试通过self.addSubview(myButton)
将UIButton直接添加到单元格中,所以我更改为self.contentView.addSubview(myButton)
并且有效
似乎contentView
在myButton
的前面,因此按钮将不会收到点击手势。
答案 3 :(得分:4)
您的UIButton
='y偏移量为160,UIView's
高度仅为120.请更改UIButton's
y偏移量并尝试。
答案 4 :(得分:4)
适用于Swift 3和Storyboard
对我来说,我必须在内容视图中启用多重触摸,并在所有内容上启用用户交互 - 表视图,表视图单元格,内容视图和UIButton。我在使用故事板。
我还将tableview单元格设置为子类。
由于我在探索问题时无法在这里找到答案,因此我发布了关于堆栈溢出的另一个问题。您可以在此处查看我的代码并下载项目:Can't click button inside UITableViewCell?
答案 5 :(得分:3)
UITableViewCell默认处理所有手势。
设置cell.selectionStyle = UITableViewCellSelectionStyleNone;
以禁用默认行为。
答案 6 :(得分:2)
我遇到了这个问题,但在我的情况下,它与表视图无关,而是因为我在我的按钮中使用userInteractionEnabled
为真的子视图,将该值设置为false(NO )对于所有按钮的子视图,为我解决了问题。
答案 7 :(得分:1)
我这样做:
let plusButton: UIButton = {
let v = UIButton()
v.setImage(plusImg, for: .normal)
v.tintColor = .dark
v.translatesAutoresizingMaskIntoConstraints = false
v.addTarget(self, action: #selector(plusButtonHandler), for: .touchUpInside)
// adding targets here did not work
return v
}()
似乎在闭包内调用addTarget方法不起作用。当我将addTarget方法考虑在内并将其放入初始化器中时,一切正常!
答案 8 :(得分:1)
更新Swift 4.2
在func tableView中(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell
添加它: cell.buttonCheckBox.isUserInteractionEnabled = false
现在,您可以选择按钮以及单元格。 这对我有效:)
答案 9 :(得分:0)
创建自定义UITableViewCell。请参阅this link。
假设您有一个名为displayButton的UIButton
,您可以执行以下操作:
创建单元格后,在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
内,
[cell.dislayButton addTarget: self
action: @selector(replyButtonPressed:withEvent:)
forControlEvents: UIControlEventTouchUpInside];
在ViewController中创建类似的方法:
- (void) replyButtonPressed: (id) sender withEvent: (UIEvent *) event
{
UITouch * touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView: self.tableView];
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: location];
}
答案 10 :(得分:0)
我有同样的问题,不知怎的,我弄清楚了我的错误
在constraints
self(UITableViewCell)
更改为constraints
并contentView
self(UITableViewCell)
后,我的单元格按钮再次可以点击。
答案 11 :(得分:0)
如果没有UIButton
中按下的UITableViewCell
的替代选择器,则需要关闭按钮userInteractionEnabled
cellButton.userInteractionEnabled = false
在这种情况下,任何按钮触摸都会传播到单元格触摸。
答案 12 :(得分:0)
尝试
public override void SetSelected(bool selected, bool animated)
{
// this.interestsButton.Selected = true;
if (selected)
{
// this.TextLabel.TextColor = UIColor.Red;
//this.interestsButton.ShowsTouchWhenHighlighted = true;
this.interestsButton.BackgroundColor = UIColor.Purple;
//this.interestsButton.SetTitleColor(UIColor.Red, UIControlState.Highlighted);
}
else
{
}
// cell.ContentView.UserInteractionEnabled = false;
base.SetSelected(selected, animated);
}
仅在“ Mvvmcross.iOS”上进行了测试