【问题标题】:Container view function not calling in parent view容器视图函数不在父视图中调用
【发布时间】:2020-12-17 14:14:30
【问题描述】:

我正在尝试在故事板编辑器中添加的容器视图中运行一个函数,但是当我在父视图控制器中调用它时,没有任何反应。我希望能够调用一个函数并更改从父级触发的子视图控制器的属性。我做错了什么还是应该换一种方式?

TLDR:从父级触发子视图控制器中的函数

父视图控制器:

//  ViewController.swift
import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var routeConfirmationView: UIView! //This is the container view that I'm trying to work with
    var RouteSelectionViewController: RouteSelectionViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(routeConfirmationView)
        
        self?.RouteSelectionViewController?.getRidOfLoadingCover(isHidden: true) //The code that isn't doing anything
    }

}

容器视图控制器:

import UIKit

class RouteSelectionViewController: UIViewController {
    
    @IBOutlet weak var loadingCoverView: UIActivityIndicatorView!
    
    override func viewDidLoad() { 
        super.viewDidLoad(

    }
    //The function that I want to trigger from the other view controller:
    func getRidOfLoadingCover (isHidden: Bool){
        if (isHidden == true) {
            loadingCoverView.alpha = 0
        }
        else if (isHidden == false) {
            loadingCoverView.alpha = 100
        }
    }
    
}

故事板:

【问题讨论】:

  • 您真正想在什么时候这样做?如果您尝试在 viewDidLoad() 中执行此操作 - 就像您发布的代码一样 - 只需在您的 viewDidLoad() 中隐藏该视图 RouteSelectionViewController。

标签: ios swift xcode uiviewcontroller


【解决方案1】:

我猜你没有设置 RouteSelectionViewController 变量(顺便说一句,变量名应该以小写字母开头),所以它是 nil 并且没有任何反应。

如果您希望将视图控制器嵌入到另一个视图控制器中,则需要实现 视图控制器包含 要求(请参阅documentation)。

【讨论】:

    【解决方案2】:

    要在容器视图中嵌入的视图控制器中调用函数或访问属性,您需要获取并保留对该控制器的引用。

    当 Container View 加载嵌入式 VC 时,它会调用 Prepare For Segue。在那里获取您的参考:

    class WithContainerViewController: UIViewController {
    
        var routeSelectionVC: RouteSelectionViewController?
    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let vc = segue.destination as? RouteSelectionViewController {
                // save reference to VC embedded in Container View
                self.routeSelectionVC = vc
            }
        }
        
        @IBAction func didTap(_ sender: Any) {
            if let vc = routeSelectionVC {
                vc.getRidOfLoadingCover(isHidden: true)
            }
        }
        
    }
    
    class RouteSelectionViewController: UIViewController {
        
        @IBOutlet weak var loadingCoverView: UIActivityIndicatorView!
        
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        //The function that I want to trigger from the other view controller:
        func getRidOfLoadingCover (isHidden: Bool){
            if (isHidden == true) {
                loadingCoverView.alpha = 0
            }
            else if (isHidden == false) {
                loadingCoverView.alpha = 100
            }
        }
        
    }
    

    您接下来可能会询问如何调用“父”VC 中的函数从嵌入式 VC。这可以通过协议/委托模式或闭包来完成。同样,您可以在为 segue 做准备时进行设置:

    class WithContainerViewController: UIViewController {
    
        var routeSelectionVC: RouteSelectionViewController?
    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let vc = segue.destination as? RouteSelectionViewController {
                // set the closure in the VC embedded in Container View
                vc.callbackClosure = {
                    self.routeSelectionButtonTapped()
                }
                // save reference to VC embedded in Container View
                self.routeSelectionVC = vc
            }
        }
    
        @IBAction func didTap(_ sender: Any) {
            if let vc = routeSelectionVC {
                vc.getRidOfLoadingCover(isHidden: true)
            }
        }
    
        func routeSelectionButtonTapped() -> Void {
            print("Button in RouteSelectionViewController in Container View was tapped!")
        }
    
    }
    
    class RouteSelectionViewController: UIViewController {
    
        @IBOutlet weak var loadingCoverView: UIActivityIndicatorView!
    
        var callbackClosure: (() -> ())?
        
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        //The function that I want to trigger from the other view controller:
        func getRidOfLoadingCover (isHidden: Bool){
            if (isHidden == true) {
                loadingCoverView.alpha = 0
            }
            else if (isHidden == false) {
                loadingCoverView.alpha = 100
            }
        }
    
        @IBAction func didTap(_ sender: Any) {
            callbackClosure?()
        }
        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多