Swift 3/iOS 10/Xcode 8
我有一个视图控制器(饼图),其中包含一个标签、两个按钮和一个空视图(将包含一个饼图)。标签和两个按钮合并到位于饼图视图上方的水平堆栈视图中。
当应用启动时,上述 VC 将嵌入到四个容器视图之一(应用的主屏幕由这四个容器视图组成)。
在饼图中,我将两个按钮链接到它们各自的IBActions和IBOutlets。单击按钮 2 时,另一个 VC 应该会出现模态 segue,但这不会发生。显然,该按钮正在记录点击 - 即当您单击它时它会改变颜色。我已经在按钮 2 的 IBAction 方法中放置了一个打印语句,但这也没有显示。控制台中也不会显示任何错误消息。
经过几个小时的狩猎,我发现发生这种情况的唯一原因是:
子视图已添加到按钮本身,因此单击事件信号通过按钮,由添加的子视图接收。对我来说并非如此。顺序是>容器视图的主应用窗口>嵌入式 VC>堆栈视图>按钮。"已启用交互"设置为"全部"为 true。
按钮部分位于包含视图之外(其高度/宽度可能大于其包含视图)。对我来说并非如此。堆栈视图、标签和两个按钮共享相同的高度,堆栈视图的宽度等于标签和按钮的宽度之和加上标签和按钮之间的间距。
我还尝试以编程方式添加事件处理程序:
SelectAnalyisButtonOutlet.addTarget(self, action: #selector(SelectAnalysisButtonClicked), for: .touchUpInside)
但同样的结果发生了。
点击事件似乎没有注册还有其他原因吗?
编辑 1
上面提到的饼图VC是从同一个容器视图(称为detailContainerView)中交换出来的几个VC之一,具体取决于在其中一个其他容器视图(称为TabBar)中单击哪个按钮(所有这些按钮都可以正常工作)。
我在另外两个 VC 中分别放置了一个按钮,这些按钮在 detailContainerView 中显示,并将它们分别连接到 IBAction。每个 IBAction 都包含一个打印语句,单击按钮时将触发该语句。目前,这两个VC仅由标签和新插入的按钮组成。当我运行应用程序时,所有按钮都不起作用。
然后,我将 detailContainerView 的其中一个 VC 设置为属性检查器中的初始视图控制器,并重新运行该应用程序。 突然,按钮现在工作了!如果我然后将按钮连接到 segue,则 segue 也可以工作!
当我详细交换VC的ContainerView时,似乎发生了一些变化。我用来交换VC的代码如下:
func SwapOutControllers(vc: UIViewController, vcName: String){
//REMOVE OLD VC
detailPaneVCReference?.willMove(toParentViewController: nil)
detailPaneVCReference?.view.removeFromSuperview()
detailPaneVCReference?.removeFromParentViewController()
var newVc: UIViewController?
switch vcName {
case "Biography":
newVc = vc as! Biography
case "Social Media":
newVc = vc as! SocialMedia
case "News Feed":
newVc = vc as! NewsFeeds
case "Stats":
newVc = vc as! StatsAboutParliament
case "Petitions":
newVc = vc as! Petitions
default:
print("Error: No VC Found!")
}
//ADD NEW VC
ParentVC?.addChildViewController(newVc!)
let width = detailContainerView?.frame.width
let height = detailContainerView?.frame.height
newVc?.view.frame = CGRect(x: 0, y: 0, width: width!, height: height!)
detailContainerView?.addSubview((newVc?.view)!)
newVc?.didMove(toParentViewController: ParentVC)
}
detailPaneVCReference 是对 detailContainerView 当前显示的任何 VC 的引用。父 VC 是包含四个容器视图的 VC。
从 ParentVC 中删除的 VC 在删除/换出后仍然存在于调试视图层次结构中 - 这是否会以某种方式阻止单击事件到达事件处理程序?
溶液!
我问题的根源是,我对每个视图控制器所做的引用被错误地声明为弱引用。我从每个声明中删除了"弱"(例如"weak var x:UIViewController?"-->"var x:UIViewController?"),瞧!,代码现在可以按预期工作!
我问题的根源是我对每个视图控制器所做的引用被错误地声明为弱引用。我从每个声明中删除了"弱"(例如"weak var x:UIViewController?"-->"var x:UIViewController?"),瞧!,代码现在可以按预期工作!