在 TableViewHeader 中以编程方式调用 IBAction

Posted

技术标签:

【中文标题】在 TableViewHeader 中以编程方式调用 IBAction【英文标题】:Calling IBAction Programmatically in TableViewHeader 【发布时间】:2011-09-15 11:03:33 【问题描述】:

我正在我的 TableView Header 单元格中以编程方式创建一个按钮,并向其添加 TouchUpInside Action。带有 UIButton 的 Header 还包含另外两个 UILabel。

问题:如果按钮被添加为子视图,它没有响应。

但是当我从 Method 只返回 UIButton 时它工作正常。

这是我的- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section代码

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



UIView *viewHeader = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 60)];

viewHeader.tag = 101;

viewHeader.backgroundColor = [UIColor cyanColor];


UIButton *btnBack = [UIButton buttonWithType:UIButtonTypeRoundedRect];

btnBack.frame = CGRectMake(15, 15, 50, 25);

//btnBack.titleLabel.text = @"Back";
[btnBack setTitle:@"Back" forState:UIControlStateNormal];

[btnBack addTarget:self action:@selector(Back:) forControlEvents:UIControlEventTouchUpInside];
btnBack.userInteractionEnabled = YES;

UILabel *lblPlayerName = [[UILabel alloc]initWithFrame:CGRectMake(75, 20, 60, 20)];
lblPlayerName.backgroundColor = [UIColor redColor];

UILabel *lblHighScoreOfPlayer = [[UILabel alloc]initWithFrame:CGRectMake(215, 20, 80, 20)];
lblHighScoreOfPlayer.backgroundColor = [UIColor yellowColor];



lblPlayerName.text = [@"Name" uppercaseString];

lblHighScoreOfPlayer.text = [@"Scores" uppercaseString];

[viewHeader addSubview:btnBack];    
[viewHeader addSubview:lblPlayerName];
[viewHeader addSubview:lblHighScoreOfPlayer];

return viewHeader;



【问题讨论】:

在你的 back 方法中设置一个断点,因为你的代码似乎是正确的。 它完成了,但是操作没有调用,因为按钮没有响应!!! 为什么写这行 btnBack.userInteractionEnabled = YES;默认属性已经是yes 尝试设置viewHeader.userInteractionEnabled = YES; UIImageView 用于显示一个图像或一系列图像,而不是用于标签或按钮。您是否尝试过使用普通的 UIView? 【参考方案1】:

首先,您将图像视图添加为 uiview 的子视图以用于标题视图,而不是 UIView *viewHeader = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 60)];

程序应按以下顺序进行。

step1.allocate UIView step2:添加imageView作为uiView的子视图 step3:将按钮添加为imageview的子视图 然后返回uiview

这是我测试过的工作代码。

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

    UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 30)] autorelease];
    UIButton *btnBack = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    btnBack.frame = CGRectMake(15, 15, 50, 25);


    [btnBack setTitle:@"Back" forState:UIControlStateNormal];

    [btnBack addTarget:self action:@selector(Back:) forControlEvents:UIControlEventTouchUpInside];
    btnBack.userInteractionEnabled = YES;

    [headerView addSubview: btnBack];
    return headerView;

【讨论】:

我添加了图像视图但没有结果.....按钮仍然没有响应!!! - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size .width, 30)] 自动释放]; UIButton *btnBack = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btnBack.frame = CGRectMake(15, 15, 50, 25); [btnBack setTitle:@"Back" forState:UIControlStateNormal]; [btnBack addTarget:self action:@selector(Back:) forControlEvents:UIControlEventTouchUpInside]; btnBack.userInteractionEnabled = YES; [headerView addSubview: btnBack];返回标题视图; 【参考方案2】:

我不确定,但您可能应该为您的主要UIView viewHeader.userInteractionEnabled = YES; 设置属性userInteractionEnabled

正如提到的@ott 尝试为viewHeader 分配UIView 而不是UIImageView

UIView *viewHeader = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 60)];

试试看。希望对你有帮助

【讨论】:

感谢您的努力,但将 userInteractionEnabled 设置为 YES 也不起作用!!!

以上是关于在 TableViewHeader 中以编程方式调用 IBAction的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GNU Make 中以编程方式定义目标?

以编程方式获取 Android 手机型号,如何在 android 中以编程方式获取设备名称和型号?

在 Windows 中以编程方式确定电源使用情况?

是否可以在 UIPageViewController 中以编程方式翻页?

如何在 Quarkus 中以编程方式注册 bean?

如何在 ios 中以编程方式添加约束