我有两个视图控制器,第一个有两个按钮,注册和登录,第二个VC执行注册和登录功能(我编写了在注册和登录模式之间切换的功能),是否可以识别用户在第一个VC中按下了登录/注册按钮,这样在执行segue时第二个VC中会调用正确的函数吗?
答案 0 :(得分:0)
您已告知第二个视图控制器在第一个视图控制器选择选项(登录或注册)时要执行的操作。我假设您可以通过简单地声明一个标志并将其发送到第二个视图控制器来完成此操作,例如:
在第二个视图控制器中声明一个布尔变量(让我们说shouldBehavesAsLogin
),这意味着如果选择是登录,那么它应该是true
:
// Controller that could represents signin or signup:
class SecondViewController: UIViewController {
//...
var shouldBehavesAsLogin = false
// ...
}
因此,您可以根据点击的按钮,第一个视图控制器来确定应该为其分配的值:
class FirstViewController: UIViewController {
// ...
private var isLoginTapped = false
@IBAction func signinTapped(sender: UIButton) {
isLoginTapped = true
}
@IBAction func signupTapped(sender: UIButton) {
// nothing to do here, isLoginTapped is false by default...
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MySegue"{
if let nextViewController = segue.destination as? SecondViewController {
nextViewController.shouldBehavesAsLogin = isLoginTapped
}
}
}
// ...
}
因此,您所要做的就是检查shouldBehavesAsLogin
的值是否true
让控制器表现为登录,或false
执行相反的操作。
其他提示:
如果为每个按钮添加IBActions的目的只是导航到第二个视图控制器,我建议让两个按钮具有相同的IBAction,但是你应该让sender
为类型UIButton
代替Any
,因此你可以做 - 例如 - :
@IBAction func aButtonTapped(sender: UIButton) {
// do the default behvior for both signin and signup (navigate to the second controller)
// signinButton is the button you tap for navigating to second controller to behaves as signin
isLoginTapped = sender === signinButton ? true : false
}
答案 1 :(得分:0)
这个答案假设两个视图控制器之间只有一个segue。如果有多个,您只需在prepareForSegue
中使用segue标识符。
我可以使用sender
或-prepare(for segue:sender:)
上的-performSegue(withIdentifier:sender)
参数来处理此问题,具体取决于您是直接从按钮还是在代码中触发segue。
如果按钮触发segue,您可以测试sender
参数是否是相关的两个按钮之一,并在目标VC上执行适当的设置。如果使用IBAction
方法在代码中触发segue,您可以通过IBAction
s sender
参数传递按钮引用,或传递一些其他标识对象{{1}} 1}}方法能够处理。
请记住,调用prepareForSegue
时目标VC的视图不会被加载,因此您可能需要在目标VC上设置一些状态(例如登录/注册枚举属性)然后用于在调用prepareForSegue
时适当地设置VC。