【问题标题】:UITableViewController select header for sectionUITableViewController 选择部分的标题
【发布时间】:2011-12-06 17:38:00
【问题描述】:

我有一个包含多个部分的UITableView。每个部分都有一个部分标题(自定义视图)是否有一种简单的方法可以检测何时有人选择了部分标题? (就像didSelectRowAtIndexPath,但是对于标题?)

【问题讨论】:

    标签: ios uitableview uikit


    【解决方案1】:

    没有,UITableViewDelegate 没有办法做到这一点。

    您可以做的是添加一个与节标题视图大小相同的按钮并将其添加到视图中。将按钮的标签设置为节索引。 然后只需将UIViewController 添加为UIControlEventTouchUpInside 的目标。

    然后通过查看按钮的标签就可以知道点击了哪个部分。

    【讨论】:

    • 或者你可以只在“viewForHeaderInSection”方法中返回一个标题大小的UIButton,而不是添加一个视图并返回它
    【解决方案2】:

    这与@rckoenes 的回答并没有根本不同,但它确实提供了一种更正统的方式来处理视图上的事件,而不是使用不可见的按钮。

    我宁愿在我的标题视图中添加一个 UITapGestureRecognizer,而不是添加不可见的按钮并调整它们的大小:

    UITapGestureRecognizer *singleTapRecogniser = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease];
    [singleTapRecogniser setDelegate:self];
    singleTapRecogniser.numberOfTouchesRequired = 1;
    singleTapRecogniser.numberOfTapsRequired = 1;   
    [yourHeaderView addGestureRecognizer:singleTapRecogniser];
    

    然后:

    - (void) handleGesture:(UIGestureRecognizer *)gestureRecognizer;
    

    您可以使用gesture.view 查看被触摸的内容。然后做任何你需要做的事情来找出它是哪个标题(标签,数据数组查找......)

    【讨论】:

    • 我认为您必须将方法更改为:- (void) gestureHandler:(UIGestureRecognizer *)gestureRecognizer;,因为您将操作定义为gestureHandler
    • 使用 YourView *tappedView = (YourView *)gestureRecognizer.view;看看哪个视图被触摸的更明确
    • numberOfTouchesRequirednumberOfTapsRequired默认为1,无需设置为1
    【解决方案3】:

    以下是在 Swift 2 中对我有用的方法:

    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let footerView = UITableViewHeaderFooterView()
        footerView.textLabel?.text = "Header Text"
        let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        tapRecognizer.delegate = self
        tapRecognizer.numberOfTapsRequired = 1
        tapRecognizer.numberOfTouchesRequired = 1
        footerView.addGestureRecognizer(tapRecognizer)
        return footerView
    }
    
    @objc func handleTap(gestureRecognizer: UIGestureRecognizer) {
        print("Tapped")
    }
    

    【讨论】:

      【解决方案4】:

      这适用于评估部分和行。我希望它可以帮助所有努力正确完成这项工作的其他人......

      override func viewDidLoad() {
          let tapGesture = UITapGestureRecognizer(target: self, action: #selector(sectionTapped(sender:)))
          tableView?.addGestureRecognizer(tapGesture)
          tapGesture.delegate = self as? UIGestureRecognizerDelegate
      }
      
      @objc func sectionTapped(sender: UITapGestureRecognizer) {
          if sender.state == UIGestureRecognizerState.ended {
              guard let tableView = self.tableView else {
                  return
              }
              if let view = sender.view {
                  let tapLocation = sender.location(in: tableView)
                  if let tapIndexPath = tableView.indexPathForRow(at: tapLocation) {              
                      if (tableView?.cellForRow(at: tapIndexPath) as? UITableViewCell) != nil {
                          // do something with the row
                          print("tapped on row at index: \(tapIndexPath.row)")
                      }
                  }  else {
                      for i in 0..<tableView.numberOfSections {
                          let sectionHeaderArea = tableView.rectForHeader(inSection: i)
                          if sectionHeaderArea.contains(tapLocation) {
                              // do something with the section
                              print("tapped on section at index: \(i)")
                          }
                      }
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多