滚动视图中的 UIViews 按钮未触发 IBAction

Posted

技术标签:

【中文标题】滚动视图中的 UIViews 按钮未触发 IBAction【英文标题】:UIViews buttons inside a scrollview not triggering IBAction 【发布时间】:2016-03-19 22:45:00 【问题描述】:

我有一个启用分页的水平滚动视图,因此每个页面都会显示一个不同的 xib 视图。一些 xib 视图中有链接到 IBAction 的按钮。我在每个 xib 的类中声明了 IBAction。一切看起来都很好,按钮显示点击效果等等,但是 IBAction 没有被触发? 这是一个代码示例:

let clockView: ClockViewController = ClockViewController(nibName: "ClockViewController", bundle: nil)

    let carView: CarViewController = CarViewController(nibName: "CarViewController", bundle: nil)

    scrollview.addSubview(clockView.view)

    carView.view.frame.origin.x = self.view.frame.width

    scrollview.addSubview(carView.view)

clockView 和 carView 都有按钮,按钮分别链接到 ClockViewController.swift 和 CarViewController.swift 中声明的 IBActions。

这是其中一个视图的外观。我没有在 xib 中添加 UIViewController,我只使用 UIView。我猜这可能是问题的一部分,但我不能使用 UIViewController 作为子视图,因为它给出了错误。

任何帮助表示赞赏,

【问题讨论】:

filesOwner 是什么? fileOwner 是同一个 xib 类,我更新了问题以表明这一点,谢谢。 我认为你的问题是你将CarView 放在一个局部变量中,所以它会在 e 函数退出时被释放。尝试将其放入实例变量/属性中 哇,这正是问题所在!我在 viewDidLoad() 中声明了 carView 当我在类中声明它时问题解决了。非常感谢你 :) 你应该把它作为一个答案,这样我才能接受它。 【参考方案1】:

问题是您将carView 声明为局部变量,因此一旦函数退出,它将被释放,因为没有任何东西可以保存强引用。视图元素本身被滚动视图引用,因此它们不会被释放,但将不再有视图控制器实例来处理事件。

如果您将 carViewclockView 更改为属性,则将保留一个强引用。

【讨论】:

【参考方案2】:

问题似乎是您在 ViewControllers 中使用 ViewControllers。如果您想通过情节提要执行此操作,则必须使用 containerView 并使用它附带的 embed segue 将 ViewController 放置在此 containerView 中。

如果您想以编程方式执行此操作,则必须将子视图控制器添加到包含您拥有的这些子视图控制器(即 carView 和 clockView)的父视图控制器中。

附:您调用视图控制器carView 有点令人困惑,也许CarViewController 不那么令人困惑:)

【讨论】:

谢谢您,很抱歉给您带来了困惑。你是对的,我不能在另一个 UIViewController 中使用 UIViewController,它给了我一个错误,所以我没有在 xib 中使用 UIViewController,我只使用 UIView。

以上是关于滚动视图中的 UIViews 按钮未触发 IBAction的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview 仅在拖动 uiviews 时滚动

CGRectIntersectsRect 未检测到相交视图

每次按下按钮时如何使 scrollView 移动?

加载不同的纵向/横向 UIViews

如何在 iOS 中的 ViewController 上加载 .xib UIviews

UITabBarController 中每个选项卡有多个 UIViews?