即使它们在故事板中连接,IB 插座也变得零

时间:2020-12-25 06:39:02

标签: ios swift xcode null

我是 Xcode 的新手,我创建了一个 UIPageViewController 和一个视图控制器,因为它是数据容器,这是我的代码:

class RootPageControllerViewController: UIPageViewController,UIPageViewControllerDataSource {
    
    var myControllers:[UIViewController] = []
    let pages:[String] = ["first","second","third","fourth","fifth","six","seven"]
    let story = UIStoryboard(name: "Main", bundle: nil)
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        for text in pages{
            let vc = self.story.instantiateViewController(identifier: "dataContainer") as! DataContainer
            vc.setText(text)
            myControllers.append(vc)
        }
        configureController()
    }
    
    func configureController(){
        self.dataSource = self
        if let first = myControllers.first{
            self.setViewControllers([first], direction: .forward, animated: true,completion: nil)
        }
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let index = myControllers.firstIndex(of: viewController),index>0 else { return nil }
        let before = index-1
        return myControllers[before]
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard  let index = myControllers.firstIndex(of: viewController),index<(myControllers.count - 1) else {
            return nil
        }
        let after = index + 1
        return myControllers[after]
    }
    
}

class DataContainer: UIViewController {
    
    @IBOutlet var titleView: UILabel!
    
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    
    func setText(_ mssg:String){
        if titleView != nil{
            titleView.text = mssg
        }
        else{
            print("reference is null")
        }
    }
}

我的插座连接正确,我已经检查了很多次,但在运行时它们也变成了零...我如何防止取消引用插座

1 个答案:

答案 0 :(得分:0)

@IBOutlet 连接在视图加载之前无效。

当您 .instantiateViewController 时,您将获得对该控制器对象的引用,但该视图尚未加载。

这是一种解决方法:

    for text in pages{
        let vc = self.story.instantiateViewController(identifier: "dataContainer") as! DataContainer
        
        // add this line
        vc.loadViewIfNeeded()
        
        vc.setText(text)
        myControllers.append(vc)
    }