UIButtons 不会显示在我的 UITableView 中

Posted

技术标签:

【中文标题】UIButtons 不会显示在我的 UITableView 中【英文标题】:UIButtons won't display in my UITableView 【发布时间】:2015-12-11 19:34:20 【问题描述】:

所以我在 UITableView 的 CustomCell 类中的 UILabel 下有 UIButtons。我得到了要显示的标签,但似乎无法显示按钮。我为自定义单元格中的所有 3 个 UI 元素设置了全方位的约束。

我还记录了每个按钮的框架,它们似乎在我的单元格的框架内。

这是我的故事板和 ios 模拟器的屏幕截图:

这是我用来设置每个单元格的代码

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

    return [_questions count];


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    CustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomCell"];

    cell.questionLabel.text = _questions[indexPath.row];
    cell.questionLabel.numberOfLines = 0;
    cell.disagreeButton.tag = indexPath.row;
    cell.agreeButton.tag = indexPath.row + 60;

    [cell.contentView addSubview:[cell.disagreeButton viewWithTag:indexPath.row]];
    [cell.contentView addSubview:[cell.agreeButton viewWithTag:indexPath.row + 60]];

    [cell.disagreeButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [cell.agreeButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];

    NSLog(@"Button 1 Frame: %@\n", cell.disagreeButton);
    NSLog(@"Button 2 Frame: %@\n", cell.agreeButton);
    NSLog(@"Cell Frame: %@\n", cell);
    return cell;


- (void)buttonClicked:(id)sender 

    UIButton *senderButton = (UIButton *)sender;

    if (senderButton.tag < 60) 
        NSLog(@"Disagree Selected\n");
     else 
        NSLog(@"Agree Selected\n");
    

我的 CustomCell.h

#import "UIKit/UIKit.h"

@interface CustomCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel* questionLabel;
@property (weak, nonatomic) IBOutlet UIButton* disagreeButton;
@property (weak, nonatomic) IBOutlet UIButton* agreeButton;

@end

【问题讨论】:

【参考方案1】:
[cell.contentView addSubview:[cell.disagreeButton viewWithTag:indexPath.row]];
[cell.contentView addSubview:[cell.agreeButton viewWithTag:indexPath.row + 60]];

[cell.disagreeButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[cell.agreeButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];

删除这些行并查看。当您为单元格提供自定义类时,您不必再次 subView。

【讨论】:

【参考方案2】:

如果您使用自定义类,则无需将按钮添加为子视图。但是,如果您想使用标签将按钮添加为子视图,请使用 -

[cell.contentView addSubview:[cell viewWithTag:indexPath.row]];

[cell.contentView addSubview:[cell viewWithTag:indexPath.row + 60]];

【讨论】:

【参考方案3】:

显示单元格的高度似乎太小而无法显示按钮,因此按钮被切断了。尝试实现这个方法:

func tableView(_ tableView: UITableView,heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat      
    return 300

尝试使用 300 作为单元格的高度。如果您可以看到按钮,则可以返回正确的单元格高度。

【讨论】:

以上是关于UIButtons 不会显示在我的 UITableView 中的主要内容,如果未能解决你的问题,请参考以下文章

使用 IOS9 时,无法在 UITable 的部分标题上的 UIButtons 上触发触摸事件(IOS10 很好)

通过从上到下滚动表格来刷新 UITable 内容

带有 UIButtons 的 UIScrollView - 当按钮开始触摸时,滚动视图不会滚动

显示 UILabels 和 UIButtons 相互内联的方法

带有 UIButtons 的 UIScrollview - 如何重新创建跳板?

调用 prepareForSegue 而不是 ib 按钮