UIButton 在我的 UITableView 的标题中不起作用

问题描述 投票:0回答:6

我不明白为什么这个

UIButton
在我的
UITableView
的标题中不起作用。它出现在那里,但触摸不起作用。

NSLog 语句也没有触发。它几乎就像是在另一个视图或其他东西的下面,这样你就可以看到它,但按下操作不起作用。

感谢您对此的任何帮助

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

UIView *sectionHeader = [[UILabel alloc] initWithFrame:CGRectNull];
sectionHeader.backgroundColor = [UIColor clearColor];

[sectionHeader addSubview:self.topMapView];

// add map launch button
mapLaunchButton = [UIButton buttonWithType:UIButtonTypeCustom];
[mapLaunchButton addTarget:self
                    action:@selector(mapButtonTouch:)
          forControlEvents:UIControlEventTouchDown];
[mapLaunchButton setTitle:@"ggggggg" forState:UIControlStateNormal];
mapLaunchButton.frame = CGRectMake(0, 0, 300, 90);
mapLaunchButton.backgroundColor = [UIColor redColor];

[sectionHeader addSubview:mapLaunchButton];


  //  [sectionHeader bringSubviewToFront:mapLaunchButton];

    self.tableView.tableHeaderView = sectionHeader;

    return sectionHeader;

}
- (void)mapButtonTouch:(id)sender {

    NSLog(@"map button was touched");
}
ios uitableview uibutton
6个回答
3
投票

我可以看到不止一个错误 -

  1. 如果您的表格只有一个部分(以验证对

    numberOfSectionsInTableView
    代表的此项检查),则删除这一行 -

    self.tableView.tableHeaderView =sectionHeader;

  2. sectionHeader.frame
    设置为适当的值(而不是
    CGRectNull
    )。设置节标题(相对于表标题视图)的好处是,当用户滚动表行时,节标题将粘在顶部(浮动)并且不会消失。 (素色桌子)

  3. 问题还是没有解决,那就请验证一下他的方法 -

    -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 返回 50; // 取决于sectionHeader的高度 }

  4. 正如其他海报所指出的,捕获 UIButton 上的触摸事件

    UIControlEventTouchUpInside
    是首选事件。

编辑 - (作为表头视图实现)

如果您想向上滚动它,请将其设置为表标题(而不是节标题)。因此,从 viewForHeaderInSection 中删除所有这些并将其放入视图控制器类的

viewDidLoad
中。保留这条线(在这种情况下不要删除它)-

self.tableView.tableHeaderView = sectionHeader;

但是,上述第2点和第4点仍然成立。


2
投票

如果将

UIControlEventTouchDown
更改为
UIControlEventTouchUpInside


1
投票

一件事是

section header
,另一件事是
table header
。您为两者分配相同的视图。我不确定这是否是您问题的原因,但它可以帮助您开始。

不要实现该方法,而是在 viewDidLoad 上创建该视图并将其指定为

self.tableView.tableHeaderView

此外,最常见的用户体验与

UIControlEventTouchUpInside
相关(直到手指抬起并仍在按钮内时才会执行该操作)。但这可能与您的问题无关。这只是何时调用该操作的问题。

如果这不能解决您的问题,请告诉我,我会尝试检查是否还遗漏了其他内容

干杯!


0
投票

如果添加视图

self.tableView.tableHeaderView = ({
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 184.0f)];

您可以添加新组件:

UIImageView, UIlabel...
它对我有用! 我测试过。

最终代码:

    self.tableView.tableHeaderView = ({
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 184.0f)];
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 40, 100, 100)];
 imageView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
        imageView.image = [UIImage imageNamed:@"avatar.jpg"];
        imageView.layer.masksToBounds = YES;
        imageView.layer.cornerRadius = 50.0;
        imageView.layer.borderColor = [UIColor whiteColor].CGColor;
        imageView.layer.borderWidth = 3.0f;
        imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;
        imageView.layer.shouldRasterize = YES;
        imageView.clipsToBounds = YES;
UIButton  *mapLaunchButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [mapLaunchButton addTarget:self action:@selector(mapButtonTouch:) forControlEvents:UIControlEventTouchDown];
        [mapLaunchButton setTitle:@"ggggggg" forState:UIControlStateNormal];
        mapLaunchButton.frame = CGRectMake(0, 0, 300, 90);
        mapLaunchButton.backgroundColor = [UIColor redColor];
        [view addSubview:imageView];
        [view addSubview:mapLaunchButton];
        view;
 });

0
投票

页脚内的按钮也有同样的问题。

作为解决方法,我们可以使用 UITapGestureRecognizer 并将其与特定按钮或其超级视图链接(因此我们可以根据需要/可能删除按钮):

class TestButtonCell: UITableViewHeaderFooterView {
static let reuseId: String = String(describing: TestButtonCell.self)
static var NIB: UINib {
    return UINib.init(nibName: reuseId, bundle: .main)
}

@IBOutlet private var buttonContainer: UIView!

var onTap: (() -> Void)? = nil

override func awakeFromNib() {
    super.awakeFromNib()
}

override func prepareForReuse() {
    super.prepareForReuse()
}

func setup() {
    let touchRecognizer = UITapGestureRecognizer(target: self,
                                                 action: #selector(handleButtonTap))
    buttonContainer.addGestureRecognizer(touchRecognizer)
}

@objc func handleButtonTap() {
    /// Notify listener
    onTap?()
}
}

-1
投票

我也有同样的问题。在以下行中将 UIXXXXXX 从 UILabel 更改为 UIView 对我有用:

 UIView *sectionHeader = [[UIXXXXX alloc] initWithFrame:CGRectNull];

我没有使用:

 self.tableView.tableHeaderView = sectionHeader;
© www.soinside.com 2019 - 2024. All rights reserved.