【问题标题】:Custom UIButton TableView not responding自定义 UIButton TableView 没有响应
【发布时间】:2021-04-01 08:03:30
【问题描述】:

我制作了一个自定义 UIButton,其中包含一个折叠 UITableView。一旦您点击按钮,表格视图高度约束就会更改,并且表格视图会以折叠效果打开。 我设法为提供表数据的按钮创建了委托,但我无法获取 didSelectRow 并滚动 tableView。我认为这可能与 tableView 折叠时需要放大按钮框架有关,但我没有设法这样做。

这是自定义 UIButton:

CollapseButton.swift
Created by  Matan Levi on 21/12/2020.


import UIKit

protocol CollapseButtonDelegate
{
var options : [String] { get }
func didSelectRow(tableView: UITableView, indexPath: IndexPath)
}

@IBDesignable class CollapseButton: UIButton {

@IBOutlet weak var btnTableViewOutlet: UITableView!
@IBOutlet weak var btnCollapseHeight: NSLayoutConstraint!

let open = CGFloat(113)
let close = CGFloat.zero
var isOpen = false
var delegate : CollapseButtonDelegate?

//  init used if the view is created programmatically
override init(frame: CGRect) {
    super.init(frame: frame)
    self.customInit()
}

//  init used if the view is created through IB
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.customInit()
}

override func awakeAfter(using aDecoder: NSCoder) -> Any? {
      guard subviews.isEmpty else { return self }
    let view = UINib(nibName: "CollapseButton", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
  }
//  Do custom initialization here
private func customInit()
{

}


@IBAction func collapseBtn(_ sender: UIButton) {
    self.btnTableViewOutlet.addBorder()
    UIView.animate(withDuration: 1) {
        self.btnCollapseHeight.constant = self.isOpen ? self.close : self.open
        sender.imageView?.transform = self.isOpen ? CGAffineTransform.identity : CGAffineTransform(rotationAngle: .pi)
        self.layoutIfNeeded()

    }
    isOpen = !isOpen
}
}

extension CollapseButton : UITableViewDelegate, UITableViewDataSource
{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return delegate?.options.count ?? 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
    cell.textLabel?.text = delegate?.options[indexPath.row]
    cell.backgroundColor = .green
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    delegate?.didSelectRow(tableView: tableView, indexPath: indexPath)
}

}

下面是按钮的实现:

extension PortfolioViewController : CollapseButtonDelegate
{
func didOpenCollapse() {
    accountBtnOutlet.setNeedsUpdateConstraints()
    accountBtnOutlet.addBorder()
}

var options: [String] {
    return FakeDataSupplier.shared.getAccountsData()
}

func didSelectRow(tableView: UITableView, indexPath: IndexPath) {
    print(indexPath.row)
}
}

我试过了:

1.检查用户交互启用 2.检查委托和数据源是否连接 3.在ui调试器中检查UITableView上方没有任何东西

任何建议将不胜感激

编辑

添加截图:

【问题讨论】:

  • 用户如何将表格视图折叠回关闭?
  • 再次按下按钮,将 uitableview 高度常数更改为零
  • 那么如果完全包含表格视图的按钮正在消耗触摸,用户如何选择一行?
  • 用户可以从按钮下打开的表格视图中选择一行
  • @Matan - 以这种方式将子视图添加到 UIButton 是不寻常的,而且如果不了解您的 xib 设置,很难给您一个可行的答案。但是,问题是您的 tableView 扩展了 按钮的边界之外...要与之交互,您需要实现 hitTest(,,,)。看看这个答案:stackoverflow.com/a/56755795/6257435——类似的问题,但使用的是 textField 而不是按钮。如果您无法在课堂上实现这一点,请使用您的 xib 详细信息更新您的问题。

标签: ios swift uitableview uibutton xib


【解决方案1】:

所以实际的解决方案是这样的: 起初,我将我的课程更改为 UIView,这使得在我的案例中添加更多视图或表格方面更加方便。之后,我为打开表和视图控制器做了委托,使用按钮我为按钮创建了一个高度约束出口,并在该按钮打开折叠表时更新它。 感谢@DonMag 指导我研究解决方案。

我会尽量让它更简单易用,但在那之前, 这是半决赛的 buttonView 类:

//
//  CollapseView.swift
//  IBITrade
//
//  Created by  Matan Levi IBI on 22/12/2020.
//

import UIKit

protocol CollapseViewDelegate
{
  func setTableViewOptions(collapseView : CollapseView) -> [String]
  func didSelectRow(collapseView : CollapseView, tableView: UITableView, indexPath: IndexPath)
  func isCollapseOpen(collapseView : CollapseView, isOpen : Bool)
}

@IBDesignable class CollapseView: UIView {

@IBOutlet weak var tableViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var collapseBtnOutlet: UIButton!
@IBOutlet weak var collapseTableViewOutlet: UITableView!

public var buttonTitle: String = "" {
        didSet {
            self.collapseBtnOutlet.setTitle(buttonTitle, for: .normal)
        }
    }

var delegate : CollapseViewDelegate?
let open = CGFloat(113)
let close = CGFloat.zero
var isOpen = false

//  init used if the view is created programmatically
let nibName = "CollapseView"
var contentView:UIView?

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    commonInit()
}
override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}
func commonInit() {
    guard let view = loadViewFromNib() else { return }
    view.frame = self.bounds
    self.addSubview(view)
    contentView = view
    
}
func loadViewFromNib() -> UIView? {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: nibName, bundle: bundle)
    return nib.instantiate(withOwner: self, options: nil).first as? UIView
}


@IBAction func openCloseTable(_ sender: UIButton) {
    collapseTableViewOutlet.addBorder()
    UIView.animate(withDuration: 1) { [self] in
        self.tableViewHeightConstraint.constant = self.isOpen ? self.close : self.open
        sender.imageView?.transform = self.isOpen ? CGAffineTransform.identity : CGAffineTransform(rotationAngle: .pi)
        delegate?.isCollapseOpen(collapseView: self, isOpen: isOpen)
        self.layoutIfNeeded()
    }
    
    isOpen = !isOpen
  }

}
extension CollapseView : UITableViewDelegate, UITableViewDataSource
  {
   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return delegate?.setTableViewOptions(collapseView: self).count ?? 0
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
    cell.textLabel?.text = delegate?.setTableViewOptions(collapseView: self)[indexPath.row]
    cell.backgroundColor = .green
    return cell
  }

  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    delegate?.didSelectRow(collapseView: self, tableView: tableView, indexPath: indexPath)
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多