我正在开发一个基本的 iOS 应用程序,作为学习 SWIFT 的一种方式(我来自 .NET 背景),并且遇到了一个问题,即我的按钮的点击方法被调用两次以进行一次触摸。
Storyboard中按钮的定义是:
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gd0-8i-21X">
<rect key="frame" x="168" y="408" width="264" height="30"/>
<state key="normal" title="Login">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="TryLogin:" destination="2H8-Z2-w9l" eventType="touchUpInside" id="Gdv-wK-xhp"/>
</connections>
</button>
附加到事件的方法是:
@IBAction func TryLogin(sender: AnyObject) {
if (!_LoggingIn) {
_LoggingIn = true
// Login user through a web-service.
_LoggingIn = false
}
}
我有额外的代码可以让用户登录,并有条件地执行 segue,但为了简单起见,我已将其删除(无论如何都会调用该方法两次)。
我尝试删除 View Controller 并从头开始重建它,通过为按钮创建一个 IBOutlet 和以下代码以编程方式将事件处理程序附加到按钮对象:
.addTarget(self, action: "TryLogin:", forControlEvents: UIControlEvents.TouchUpInside)
在任何一种情况下都会适本地调用该方法 - 但每次“点击”它总是被调用两次。当我调试它时,第二个事件通常在第一次执行的一半左右引发。这是在运行 iOS 8.1.3 的 iPad Mini 2 上。当我使用 IBOutlet 时,我非常小心地删除了附加按钮的设计器代码,而当我使用设计器时,我非常小心地删除了 IBOutlet。
这是我使用的 IBOutlet 方法的示例:
class LoginController: UIViewController {
@IBOutlet weak var _UserName: UITextField!
@IBOutlet weak var _Password: UITextField!
@IBOutlet weak var _Login: UIButton!
private var _LoggingIn: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
_Password.secureTextEntry = true;
_Login.addTarget(self, action: "TryLogin:", forControlEvents: UIControlEvents.TouchUpInside)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func TryLogin(sender: AnyObject) {
if (!_LoggingIn) {
_LoggingIn = true
// Do login work.
_LoggingIn = false
}
}
}
任何帮助或指点都将不胜感激,因为我已经在这个问题上绕了一段时间了。
谢谢。
最佳答案
尝试向同一个 View 添加另一个按钮,但需要另一个 IBAction 回调
关于两次引发 iOS Storyboard事件 (SWIFT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050801/