【问题标题】:IBAction func properly connected but not executingIBAction 函数正确连接但未执行
【发布时间】:2015-10-02 18:15:11
【问题描述】:

我目前正在制作一个用于快速练习的演示 iOS 应用程序,但遇到了一个问题。我刚刚创建了一个新页面,这个页面上只有一个按钮。我已将该按钮链接到 IBAction 函数,它显示了正确的连接。

我会给你看一个屏幕截图,但我没有足够的声誉(我遇到的所有其他问题我都可以找到其他人的帖子)。

它甚至会显示带有实心圆点的圆圈,并且在单击时会显示正确的按钮。在连接检查器中,它在发送的事件下显示了“Touch Up Inside”和“UserPage btnProgressClick”之间的连接(Userpage 是我的类,它扩展了 UIViewController 并被这个特定的 View Controller 引用,btnProgressClick 是我想要的 IBAction 函数的名称运行)。

我找到了this post,我尝试了一个干净的构建,但没有奏效。我还移动了我的按钮并在模拟器中正确更新。

btnProgressClick 中的代码永远不会执行。我在第一行放了一个断点,它没有中断。

这是将按钮链接到函数的“Main.storyboard”XML 代码。

    <!--User Page-->
    <scene sceneID="aNb-aX-hZF">
        <objects>
            <viewController storyboardIdentifier="UserPage" id="w2h-zR-Kdu" customClass="UserPage" customModule="GenomeTrackerDemo" customModuleProvider="target" sceneMemberID="viewController">
                <layoutGuides>
                    <viewControllerLayoutGuide type="top" id="9dS-Hw-ZYg"/>
                    <viewControllerLayoutGuide type="bottom" id="7PS-pA-lFe"/>
                </layoutGuides>
                <view key="view" contentMode="scaleToFill" id="w6A-eT-aKv">
                    <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                    <subviews>
                        <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JGD-xx-tMQ">
                            <rect key="frame" x="20" y="48" width="46" height="30"/>
                            <state key="normal" title="Button"/>
                            <connections>
                                <action selector="btnProgressClick:" destination="w2h-zR-Kdu" eventType="touchUpInside" id="F1N-QY-fhb"/>
                            </connections>
                        </button>
                    </subviews>
                    <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                </view>
            </viewController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="Fsq-L4-Are" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="1043" y="426"/>
    </scene>

这里是 UserPage 类:

import Foundation
import UIKit

class UserPage: UIViewController {

    var thisUser: User = User()

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func btnProgressClick(sender: UIButton) {

        let storyboard = UIStoryboard(name: "Main", bundle:nil)

        let vc: progressPage = storyboard.instantiateViewControllerWithIdentifier("progressPage") as! progressPage


        UIView.transitionFromView(self.view, toView: vc.view, duration: 0.8, options: UIViewAnimationOptions.TransitionFlipFromRight, completion: nil)
    }

}

正如我之前所说,这是我的第一个问题,因此我愿意就其措辞方式和我提供的信息提供反馈。

我想添加一些有关如何调用此页面的信息。它在对 Web 服务的异步调用之后调用。成功取回数据后,我使用此功能转换到页面:

func afterSuccessfulLogin(thisUser: User){

    dispatch_async(dispatch_get_main_queue()){
        let storyboard = UIStoryboard(name: "Main", bundle:nil)

        let vc: UserPage = storyboard.instantiateViewControllerWithIdentifier("UserPage") as! UserPage
        vc.thisUser = thisUser


        UIView.setAnimationCurve(.EaseIn)

        UIView.transitionFromView(self.view, toView: vc.view, duration: 1.2, options: UIViewAnimationOptions.TransitionFlipFromRight, completion: nil)
    }
} 

不确定这是否会有所不同,但我想我会把它扔在那里。

关于这个问题的任何帮助都会非常有用。

谢谢!!

【问题讨论】:

  • 您如何验证该函数没有被调用,您是否尝试在该函数中放置一个断点以验证它没有发生?
  • 同意。听起来插座是正确制作的,所以我很好奇是否正在调用任何函数。
  • 是的,这正是我所做的。断点从未被击中。对不起,我应该把它放在帖子里。
  • @IBAction 应该这样做,但尝试将关键字 dynamic 放在 @IBActionfunc 之间。
  • 只是想评论一下您在第一个问题上做得很好。感谢您付出努力并展示您迄今为止所做的尝试。

标签: ios xcode swift uibutton


【解决方案1】:

[删除之前的答案,由于有问题的其他信息]

iOS 包含一个视图层次结构和一个视图控制器层次结构。这两者都需要保持一致。在问题中发布的代码中,仅处理视图层次结构。尝试以下更改:

  1. 在通过vc 调用transitionFromView:toView:duration:options:completion: 之前,在self 上调用addChildViewController:
  2. transitionFromView:toView:duration:options:completion: 方法的完成块中,在vc 上调用didMoveToParentViewController:,传递self

    let storyboard = UIStoryboard(name: "Main", bundle:nil)
    
    let vc: UserPage = storyboard.instantiateViewControllerWithIdentifier("UserPage") as! UserPage
    vc.thisUser = thisUser
    
    
    UIView.setAnimationCurve(.EaseIn)
    
    self.addChildViewController(vc)
    UIView.transitionFromView(self.view, toView: vc.view, duration: 1.2, options: UIViewAnimationOptions.TransitionFlipFromRight, completion: { (finished) -> Void in vc.didMoveToParentViewController(self) })
    

调用transitionFromView:toView:duration:options:completion: 并将self.view 作为fromView 参数传递也有点奇怪。 fromView 参数通常被删除并替换为toView 参数,这将使视图控制器层次结构中的原始视图控制器在视图层次结构中没有实际视图。引入要替换的嵌套 UIView 而不是 self.view 可能是明智之举。

【讨论】:

  • 不高兴。我断开了连接。目标成员在其中有目标应用程序并已检查。 UserPage 在 Class 字段中输入时确实会自动填充。我用 ctrl-drag 将按钮重新连接到函数并再次运行它。仍然没有执行该功能....这让我很生气。
  • 我唯一能想到的另一件事是您的按钮禁用了用户交互,或者它正在其父视图的边界之外绘制,但父视图未设置为剪辑子视图。 :/ 当你触摸它时它是否明显突出显示?
  • 刚刚检查了按钮的属性检查器并选中了用户交互启用。是的,当我单击它时,按钮会明显突出显示。 “按钮”一词闪烁白色。
  • 我将在描述中添加其他内容。该页面以一种奇怪的方式被调用。我不认为它应该有所作为,但无论如何现在这没有任何意义。
  • 就像其他评论者提到的那样,如果您可以将项目发布到某个地方,我会很高兴看到它。
最近更新 更多