gpt4 book ai didi

ios - 如何从 PageViewController 访问 ViewController 组件

转载 作者:行者123 更新时间:2023-11-28 15:56:44 26 4
gpt4 key购买 nike

我有两个简单的 View 如下

enter image description here

第一个是 PageView 第二个是简单的 viewController,上面有一个 ImageView

viewController代码如下

class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.white
imgView.image = UIImage(named: "dog0")
}
}

当我将此 View Controller 作为初始 View Controller 运行时。它工作正常。它正确显示图像

但是当我使用以下代码从页面 View Controller 执行相同操作时

class PageViewController: UIPageViewController, UIPageViewControllerDataSource {

let imageNames = ["dog0","dog1","dog2"]
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
let eachView = ViewController()
eachView.imageName = imageNames.first
let viewControllers = [eachView]
setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
return nil
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
return nil
}


}

class ViewController: UIViewController {
var imageName : String? {
didSet {
imgView.image = UIImage(named: imageName!)
}
}
@IBOutlet weak var imgView: UIImageView!

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.white
}
}

出现以下错误

fatal error: unexpectedly found nil while unwrapping an Optional value

在线

imgView.image = UIImage(named: imageName!)

问题是什么以及如何解决?

最佳答案

问题是这一行:

let eachView = ViewController()

这会“凭空”创建一个 ViewController 实例,没有任何关联的主 view。因此,当 View 加载时,它是空的。因此, View 中没有 ImageView ,imgViewnil。因此,当您引用 imgView 时就好像它不是 nil(试图设置它的 image)时,您会崩溃。

正确的步骤是实例化您在 Storyboard中设计的ViewController那个 ViewController 实例在它的view 中有一个 ImageView ,因为你设计了它(你把它放在那里),并且它有一个imgView outlet,如您所知,同样是因为您设计了它(您将它放在那里)。

要获取那个 ViewController 实例,获取对 Storyboard的引用(可能是self.storyboard)并调用instantiateViewController(withIdentifier:) .当然,您必须在 Storyboard中为这个 ViewController 实例分配一个标识符。

然后你需要像这样重写ViewController:

class ViewController: UIViewController {
var imageName : String? {
didSet {
imgView?.image = UIImage(named: imageName!)
}
}
@IBOutlet weak var imgView: UIImageView? // note the question mark

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.white
imgView?.image = UIImage(named: imageName!) // note the repeat
}
}

原因是您现在遇到了计时问题:您在 View 加载之前设置了 imageName,所以 imgView 仍然 没有连接到它的 socket 。通过将关键行移动到 viewDidLoad 中,您可以确保我们在 实际上有一个 View 和一个导出之后执行此操作。

关于ios - 如何从 PageViewController 访问 ViewController 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41626290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com