[在完成Udemy课程时,我正在尝试创建一个简单的登录/注册界面。在我的第一个视图控制器中,我有一个垂直的堆栈视图,其中包含标签,分段控件和容器视图。分段控件可以是“登录”或“注册”。我想在分段控件更改时加载适当的视图控制器。
我的LogInViewController具有垂直堆栈视图,其中包含用于用户名的文本字段,用于密码的文本字段和“登录”按钮。我的SignUpViewController具有垂直堆栈视图,其中包含用于电子邮件地址,用户名,密码和密码确认的文本字段,然后是“注册”按钮。
我的第一个视图控制器看起来像这样:
import UIKit
class ViewController: UIViewController, LogInViewDelegate, SignUpViewDelegate
{
@IBOutlet weak var logInSignUpControl: UISegmentedControl!
@IBOutlet weak var containerView: UIView!
var logInVC: LogInViewController?
var signUpVC: SignUpViewController?
var activeVC = 0
override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view.
initializeCustomControllers()
}
func initializeCustomControllers()
{
let storyboard = UIStoryboard(name: "Main", bundle: nil)
logInVC = storyboard.instantiateViewController(withIdentifier: "LogInViewController") as? LogInViewController
signUpVC = storyboard.instantiateViewController(withIdentifier: "SignUpViewController") as? SignUpViewController
logInVC?.delegate = self
signUpVC?.delegate = self
logInVC?.willMove(toParent: self)
logInVC?.view.frame = containerView.bounds
containerView.addSubview(logInVC!.view)
addChild(logInVC!)
logInVC?.didMove(toParent: self)
}
func swapCustomController(from: UIViewController,to: UIViewController)
{
from.view.removeFromSuperview()
from.removeFromParent()
to.willMove(toParent: self)
to.view.frame = containerView.bounds
containerView.addSubview(to.view)
addChild(to)
to.didMove(toParent: self)
}
@IBAction func logInSignUpControlTapped(_ sender: Any)
{
switch logInSignUpControl.selectedSegmentIndex
{
case 0:
if activeVC == 1
{
swapCustomController(from: signUpVC!, to: logInVC!)
activeVC = 0
}
case 1:
if activeVC == 0
{
swapCustomController(from: logInVC!, to: signUpVC!)
activeVC = 1
}
default:
break
}
}
func logInAttempted(error: Error?)
{
if error == nil
{
// segue
print("log in successful")
}
else
{
showAlert(title: "Log In error",
message: error?.localizedDescription ?? "Unknown Error")
}
}
func signUpAttempted(error: Error?)
{
showAlert(title: "Sign Up Error",
message: error?.localizedDescription ?? "Unknown Error")
}
}
问题是,当将登录视图或注册视图加载到容器视图中时,无法从模拟器中使用字段和按钮。我无法点击文本字段,并且按钮无响应。
[我尝试将对makeFirstResponder()的调用添加到第一个文本字段,这使我可以输入文本,但是按钮仍然无法使用。
提前感谢您的帮助。
这里的主要问题可能是在“垂直堆栈视图”一词中。堆栈视图只有通过自动布局约束调整大小后才能正确运行。您的可能未正确固定为其超级视图。
而且,在将容器的边界分配给子视图的框架后,可能看不到调整容器视图大小的可能性,我也看不到任何代码。
此外,这在这里可能无关紧要,但是通常请注意,您的舞蹈操作不正确:
logInVC?.willMove(toParent: self)
logInVC?.view.frame = containerView.bounds
containerView.addSubview(logInVC!.view)
addChild(logInVC!)
logInVC?.didMove(toParent: self)
正确顺序的正确命令是:
addChild(logInVC!)
logInVC!.view.frame = containerView.bounds
containerView.addSubview(logInVC!.view)
logInVC!.didMove(toParent: self)
[一般来说,子视图控制器视图没有响应的问题是,因为插座没有连接好,或者是因为视图控制器被允许跌落在地板上,使得视图无法与任何人交谈。
但是,在您的情况下,很可能是因为按钮未正确配置堆栈视图而最终超出了其超级视图的范围。 (您可以使用View Debugger确认该假设。)在其超级视图之外的视图是可见的,但不可触摸。