ios - 为什么我的容器中 View 中的组件不可用?

标签 ios swift xcode uicontainerview

在学习 Udemy 类(class)时,我正在尝试制作一个简单的登录/注册界面。在我的第一个 View Controller 中,我有一个垂直堆栈 View ,其中包含一个标签、一个分段控件和一个容器 View 。分段控件可以是“登录”或“注册”。我想在分段控件更改时加载适当的 View Controller 。

Top Level View Controller

我的 LogInViewController 有一个垂直堆栈 View ,其中包含一个用于用户名的文本字段、另一个用于密码的文本字段和一个登录按钮。我的 SignUpViewController 有一个垂直堆栈 View ,其中包含用于电子邮件地址、用户名、密码和密码确认的文本字段,后跟一个注册按钮。

我的第一个 View Controller 是这样的:

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")
    }
}

问题是,当登录或注册 View 加载到容器 View 中时,字段和按钮在模拟器中不可用。我无法点击文本字段,按钮没有响应。

我尝试将对 makeFirstResponder() 的调用添加到第一个文本字段,这允许我输入文本,但按钮仍然无法使用。

在此先感谢您的帮助。

最佳答案

这里的主要问题可能出在“垂直堆栈 View ”这个词上。堆栈 View 只有在由自动布局约束调整大小时才能正确运行。你的可能没有正确地固定到它的 super View 。

此外,我没有看到任何代码让您解决在将容器 View 的边界分配给 subview 的框架后容器 View 可能会调整大小的可能性。


此外,这在这里可能无关紧要,但通常请注意,您的舞蹈跳错了:

    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)

在 subview Controller View 没有响应的一般问题中,要么是因为 socket 没有连接,要么是因为 View Controller 已经被允许掉在地上,留下 View 没有人可以与之交谈。

但是,在您的情况下,很可能是因为按钮最终超出了它们的 super View 的范围,因为堆栈 View 配置不正确。 (您可以使用 View Debugger 来确认该假设。)在其父 View 之外的 View 是可见的,但不可触摸。

关于ios - 为什么我的容器中 View 中的组件不可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59439110/

相关文章:

ios - 可以转换为 Swift 5

ios - 带有本地视频文件的 AVPlayer

ios - 从 Parse localDataStore 查询对象

ios - 在 SWIFT 中为 iOS 开发解析 json 的问题

ios - 如何从应用程序对 Xcode 项目进行逆向工程?

objective-c - '+系统字体大小:' not found

ios - 如何给UIButton设置3d效果

ios - iPhone 图像与 Photoshop 中的同一图像 "saved-as"之间的 OCR 结果不同

swift - AVAudioSourceNode如何设置设置格式

ios - 如何在动态 TableView 中有一个静态单元格?