我有一个表格视图,每个单元格包含一个按钮。除了 7 之外,所有 iOS 版本都运行良好。我不知道发生了什么。该单元在一个 xib 文件中构建。
谁能给我一些建议?提前致谢。
我有一个表格视图,每个单元格包含一个按钮。除了 7 之外,所有 iOS 版本都运行良好。我不知道发生了什么。该单元在一个 xib 文件中构建。
谁能给我一些建议?提前致谢。
对我有用的是:
contentView.userInteractionEnabled = NO;
从笔尖加载我的自定义单元格后调用。在创建 nib 文件中定义的视图后,该内容视图似乎已创建并设置为顶级子视图。
Calling [cell bringSubviewToFront:button]
after loading the cell from nib solved this for me.
我也一直在努力解决这个问题,我对 stackoverflow 和互联网上的不同答案进行了大量研究,解决方案因问题的根源而异。在大多数情况下,您需要对应该采取用户操作(点击/单击等)的元素执行以下操作:
myButton.userInteractionEnabled = YES;
特别是对于 UILabel/UIImageView,默认情况下userInteractionEnabled
标志是NO
.
如果您从 xib 加载视图,则需要确保从自定义单元格视图、内容视图和您希望启用用户操作的元素中选中所有复选框:
在上面的示例中,DeviceViewCell、Content View和Button元素都选中了“ User Interaction Enabled ”复选框。
如果自定义单元格是作为 UITableViewCell 的子类实现的,并且自定义单元格视图是从另一个 xib 文件动态加载的,那么您必须再做一件让大多数人感到困惑的事情,但我稍后会解释原因
:自定义单元格的初始化方法,您需要执行以下操作:
self.contentView.userInteractionEnabled = NO
self
您创建的 UITableViewCell 的子类在哪里。同样,如果自定义单元格实现为 UITableViewCell 的子类,并且自定义单元格视图是从另一个 xib 文件动态加载的,则需要执行上述操作。这是解释:
self.contentView
与Content View
您在 Interface Builder 中看到的不同,它是由系统创建的default content view
,位于自定义单元格视图中所有其他视图/元素的顶部,并且它掩盖了视图层次结构中的其余视图。因此,在自定义单元格视图中的 UI 元素可以接收用户交互事件之前,您需要为其禁用用户交互。希望这可以帮助。如果您有更好的解释,我很想听听:-)。同样是我的观察,可能还有其他原因。欢迎讨论!
问题是您的 nib 不包含 contentView,这是自 iOS 8 SDK 以来所要求的(我是根据经验编写的,没有可行的来源,抱歉)。
当您UITableViewController
向情节提要添加一个 UITableViewCell 时,它会UITableView
自动添加到其中。如果你看一下这个UITableView
,你会contentView
在里面看到一个。
因此,当您将 an 子类化UITableViewCell
并使用 .xib 创建它时,您必须单击并拖动 aUITableViewCell
到 xib 而不是默认的UIView
. 然后不要忘记将 File Owner 类和UITableViewCell
类设置为您的子类。
这个问题的解决方案是;
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell.bringSubviewToFront(cell.YOUR_UIView)
}
这对我有用。
我遇到了同样的问题。原来我在 IB 中创建了一个 UIView 对象,然后将它的类设置为 UITableViewCell 的子类。
由于我最初在 IB 中创建的对象是 UIView,因此 UITableViewCell contentView 直到运行时才被添加,这恰好位于我的 UIButtons 之上,使它们无法选择。
显然,有很多事情可能会出错,并且一些修复适用于某些 iOS 版本,而不适用于其他版本。
我的问题是我有一个 UIButton,它不是 cell.contentView 的直接子视图(即它是子视图的子视图)。我必须将我的按钮直接添加到 cell.contentView 以便它可以点击。(iOS v8+)
我一直遇到同样的问题。原因是
self.contentView.Frame.size.height
始终为 44。
有一个建议您可以在覆盖方法中设置您self.contentView.Frame
的self.frame
-(void)layoutSubviews
问题将得到解决
就我而言,我希望用户与之交互的所有内容都在 ContentView 之外。此外,我不希望单元格在被选中时突出显示。
所有标签(名称、类别等)都位于“内容视图”下。网站按钮不在“内容视图”下,而是在“本地目录表单元格”下。
在我的 tableViewController 方法 tableView:cellForRowAtIndexPath: 我有以下代码: cell.contentView.userInteractionEnabled = NO;
就是这样,用户可以与按钮进行交互。我不使用 [cell bringSubviewToFront:cell.websiteButton];
正如其他人指出的那样,始终将子视图添加到单元格的内容视图中。如果您有重写layoutSubviews
方法,请确保调用超级实现。忘记调用超级实现会产生意想不到的结果。
我的情节提要的原型单元格中的 UIButton 有同样的问题。我通过在原型单元格上检查“启用用户交互”来解决它。这适用于 iOS 7.1。
我在这里没有看到的最明显的错误是你必须有一个 selectedBackgroundImage 才能让 UIButton 在被选中时看起来不同。这些不像 UITableViewCells。
myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)
我将 UITableViewCell 子类化并通过更改此代码解决了它:
addSubview(myButton)
对此:
contentView.addSubview(myButton)
在我的 UITableViewCell 子类中。
我在 UITableViewCell 和 UICollectionViewCell 上都遇到了类似的问题。要遵循的几个步骤:
简而言之,TableView/CollectionView 单元格不能采用启用自动布局的可操作子视图(UIButton、UISegmentedControl)。如果您需要它,请禁用自动布局并提供框架(或)将它们放在容器视图中(容器视图应禁用自动布局)并将可操作视图(具有自动布局)作为子视图添加到容器视图.
就我而言,我还需要检查单元格本身(不仅仅是 contentView)的“用户交互已启用”。但正如其他答案所述,发生这种情况可能有多种原因,所以我相信这不适用于每种情况。
足够连线,对我来说实际的解决方案是转到故事板,在单元格中选择 contentview,然后检查“userInteractionEnabled”......否则即使您在按钮或单元格上启用了 userInteraction,contentview 也会始终阻止操作.
我对该单元有透明的看法,该单元实现了一些内部功能并处理了对自我的触摸。
None of these answers worked for me.
The only way I was able to fix this problem was to set the table cell selection from single to none. After that, I was able to receive button call backs.
当您使用 Interface Builder (Storyboard) 时,请务必User Interaction Enabled
从Content View
我检查了所有内容,但在情节提要中犯了一个愚蠢的错误,我的按钮的超级视图低于其他视图。所以触摸没有传递给我的按钮。
如果你有一个 CUSTOM 单元类,只需包含self.selectionStyle = .none
在awakeFromNib()
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.selectionStyle = .none
}
在 Swift 5 中,我创建了一个 UITableViewCell 类并创建了一个 UIButton。
class DashboardingGameTableViewCell: UITableViewCell {
// MARK: Setup Views
var showInteractiveButton: UIButton = {
let interactive = UIButton()
interactive.setTitle("", for: .normal)
interactive.contentEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 10.0, right: 10.0)
interactive.setImage(UIImage(systemName: "ellipsis"), for: .normal)
interactive.tintColor = .white
interactive.backgroundColor = .clear
interactive.translatesAutoresizingMaskIntoConstraints = false
return interactive
}()
...
在我的
class DashboardingGameViewController: UIViewController, UITableViewDelegate, UITableViewDataSource...
UIButton 不可点击
因为它有效,我必须...
在 DashboardGameViewController: UITableViewCell...
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.isUserInteractionEnabled = false
addSubview(showInteractiveButton)
...
在 DashboardGameViewController 上:UIViewController、UITableViewDelegate、UITableViewDataSource...
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reusableIdentifier,
for: indexPath) as! DashboardingGameTableViewCell
cell.showInteractiveButton.addTarget(self, action: #selector(interactiveGames(_:)), for: .touchUpInside)
...
// MARK: - Private Funcs
@objc private func interactiveGames(_ button: UIButton) {
present(ShowInteractiveGameViewController(), animated: true, completion: nil)
}
我的问题是我添加了默认情况下禁用用户交互UIButton
的子视图。所以我不得不启用它:UIImageView
imageView.isUserInteractionEnabled = true
好的,我已经找到了解决这个问题的方法,但这似乎是一个巨大的 hack;但是,这是我所能想到的(这里没有其他东西对我有用)。
在我的顶部,我button
添加了一个 UITextField,它代表有问题的表格视图单元格。该 tableViewCell 实例实现-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField
并返回NO
.