将UIButton添加到UITableView节标题

我有一个UITableView与1节和部分标题,我想保持一切有关标题相同,但只需在右侧添加一个button。 我不能把button放在导航控制器中,因为两个可用的点放置这样的button已被其他button占用。

在这里你可以看到我试图做的结果。 现在我想要做的只是在标题的右侧放置一个添加button,但是我所尝试的操作并不起作用。 我也尝试了一些StackOverflow的其他解决scheme,但他们没有达到我想做的。 此外,如果有更好的方法来创build一个添加button,请让我知道。 我尝试使用UIBarButtonItem但我不知道如何将其视图添加到实际的视图。 谢谢!

在这里输入图像说明

这是我在我的代表迄今为止:

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIButton *addButton = [[UIButton alloc] init]; //I also tried setting a frame for the button, but that did not seem to work, so I figured I would just leave it blank for posting the question. addButton.titleLabel.text = @"+"; addButton.backgroundColor = [UIColor redColor]; [self.tableView.tableHeaderView insertSubview:addButton atIndex:0]; //I feel like this is a bad idea return self.tableView.tableHeaderView; } - (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 50; } 

问题是你的self.tableView.tableHeaderView在这个时候是nil ,所以你不能使用它。 所以你需要做的是创build一个UIView,添加标题和button,设置它们的样式,然后返回。

这应该添加标题和button到您的部分标题,你仍然需要风格标题正确的字体和大小,但会给你一个想法。

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { CGRect frame = tableView.frame; UIButton *addButton = [[UIButton alloc] initWithFrame:CGRectMake(frame.size.width-60, 10, 50, 30)]; [addButton setTitle:@"+" forState:UIControlStateNormal]; addButton.backgroundColor = [UIColor redColor]; UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 30)]; title.text = @"Reminders"; UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; [headerView addSubview:title]; [headerView addSubview:addButton]; return headerView; } 

从iOS 6开始,你也可以实现

 - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section 

在你的UITableViewDelegate 。 例如:

 - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { if (section == 0) { if ([view.subviews.lastObject isKindOfClass:[UIButton class]]) { return; } UIButton *button = [UIButtonbuttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(view.frame.size.width - 160.0, 0, 160.0, view.frame.size.height); // x,y,width,height [button setTitle:@"My Button" forState:UIControlStateNormal]; [button addTarget:self action:@selector(sectionHeaderButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; [view addSubview:button]; } } 

你可以通过使用下面的代码来做到这一点,你可以把任何types的视图放在标题视图中,但是你必须为它指定框架。

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view=[[UIView alloc]init]; UIButton *addButton=[UIButton buttonWithType:UIButtonTypeContactAdd]; addButton.frame=CGRectMake(250, 0, 100, 50); [view addSubview:addButton]; [tblView.tableHeaderView insertSubview:view atIndex:0]; //I feel like this is a bad idea return view; } 

你有两个select,都通过你的tableView.delegate 。 第一个涉及到实现委托方法

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

这使您可以在自定义视图中基本上返回任何您想要的内容,这将用作所需部分的标题。 这可能是如此简单

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIButton *addButton = [UIButton buttonWithType:UIButtonTypeContactAdd]; [addButton addTarget:self action:@selector(SomeMethod:) forControlEvents:UIControlEventTouchUpInside]; return addButton; } 

这将把一个圆形的信息button(居中)作为您的标题。 但更有可能的是,你会想创build一个实际的UIView对象,并用你的button(和一个章节标题标签?)填充它,并根据你的喜好把所有东西放在一起[见别人的答案如何做到这一点]。

但是,第二种方法可能更好的一般情况下简单地添加一个button(您的部分标题之一)[我知道你说的1节,但很多人可能会在这个问题想要在类似的多节表]。 这涉及实施委托方法

 - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section 

基本上把你的button添加到头后的事实; 特别

 - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section { // Remove old button from re-used header if ([view.subviews.lastObject isKindOfClass:UIButton.class]) [view.subviews.lastObject removeFromSuperview]; if (section == MySectionNumberWithButton) { UIButton *addButton = [UIButton buttonWithType:UIButtonTypeContactAdd]; [addButton addTarget:self action:@selector(SomeMethod:) forControlEvents:UIControlEventTouchUpInside]; [view addSubview:addButton]; // Place button on far right margin of header addButton.translatesAutoresizingMaskIntoConstraints = NO; // use autolayout constraints instead [addButton.trailingAnchor constraintEqualToAnchor:view.layoutMarginsGuide.trailingAnchor].active = YES; [addButton.bottomAnchor constraintEqualToAnchor:view.layoutMarginsGuide.bottomAnchor].active = YES; } } 

注意,因为tableView会重新使用标题,所以在多节表格中,你必须确保删除以前添加的任何button,否则最终会在不需要的部分添加button。 然后,如果这是正确的部分,将button添加到现有的标题。 请注意,我使用NSLayoutAnchor (iOS 9 +)来简化布局button; 你可以使用NSLayoutConstraint (iOS 6+)

这种方法具有明显的优势 – 只需添加一个button – 您不必重新创build常规布局来匹配所有其他(非button)标题,或者担心在旋转设备时边距变化等。特别是,标题标题是未触及过的,并将保留您可能已经为表格标题(例如字体,颜色,…)定义的全局外观设置,如果您使用tableView:viewForHeaderInSection: ,所有这些都将重新创buildtableView:viewForHeaderInSection:方法。

如果您对Swift解决scheme感兴趣:

 override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let frame = tableView.frame let button = UIButton(frame: CGRectMake(5, 10, 15, 15)) // create button button.tag = section // the button is image - set image button.setImage(UIImage(named: "remove_button"), forState: UIControlState.Normal) // assumes there is an image named "remove_button" button.addTarget(self, action: #selector(TestController.remove(_:)), forControlEvents: .TouchUpInside) // add selector called by clicking on the button let headerView = UIView(frame: CGRectMake(0, 0, frame.size.width, frame.size.height)) // create custom view headerView.addSubview(button) // add the button to the view return headerView } 

您可能需要在部分中指定标题的高度。 这必须与自定义视图的高度同步:

 override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return CGFloat(30) } 

复杂的答案,请查看博客文章: http : //swiftspace.org/ios-add-button-table-header/