从未在页面视图容器swift中显示的API传递的图像

我正在开发一个iOS应用程序,它使用alamofire和swiftyJSON与API交互。 在这个api中,我得到了一堆返回的值,其中一个是图像。 返回的图像以数组的forms出现,但我能够遍历数组并显示单个图像。 为了使应用程序更高级,我决定在我的应用程序中实现UIPageViewController类。 我调用了API函数并试图将我的图像传递给视图控制器。

我的故事板中的事物列表

  1. 一个UIPageView
  2. 带有UIImage的UiViewController嵌入其中。

据我所知,我的代码很好,但是当我运行应用程序时,控制台上没有任何反应。 以下是我的代码。

protocol ProductImagesPageViewControllerDelegate: class { func setupPageController(numberOfPages: Int) func turnPageController(to index: Int) } class ProductPageVC: UIPageViewController { weak var pageViewControllerDelegate: ProductImagesPageViewControllerDelegate? override func viewDidLoad() { super.viewDidLoad() automaticallyAdjustsScrollViewInsets = false dataSource = self delegate = self } func configureImg() { let productId = ProductServices.instance.selectedProduct?.id ProductServices.instance.findIndividualProducts(id: productId!, completion: { (success) in if success { ProductServices.instance.productDetails.forEach({ (productDetail) in let images = productDetail.productImg.count if images > 0 { for image in 0.. 0 { for image in 0.. index { direction = .reverse } } self.configureDisplaying(viewController: controller) setViewControllers([controller], direction: direction, animated: true, completion: nil) } func configureDisplaying(viewController: UIViewController) { for (index, vc) in controllers.enumerated() { if viewController === vc { if let imageVC = viewController as? ImagesVC { imageVC.configureImage(productIndex: index) self.pageViewControllerDelegate?.turnPageController(to: index) } } } } } // MARK: - UIPageViewControllerDataSource extension ProductPageVC : UIPageViewControllerDataSource { func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { if let index = controllers.index(of: viewController) { if index > 0 { return controllers[index-1] } } return controllers.last } func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { if let index = controllers.index(of: viewController) { if index < controllers.count - 1 { return controllers[index + 1] } } return controllers.first } } extension ProductPageVC : UIPageViewControllerDelegate { func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { self.configureDisplaying(viewController: pendingViewControllers.first as! ImagesVC) } func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { if !completed { self.configureDisplaying(viewController: previousViewControllers.first as! ImagesVC) } } } 

这是我的ImageVC代码

 class ImagesVC: UIViewController { @IBOutlet weak var imageView: UIImageView! func configureImage(productIndex : Int) -> Void { ProductServices.instance.productDetails.forEach { (productImg) in if productImg.productImg.count > 0 { imageView.sd_setImage(with: URL(string: productImg.productImg[productIndex]!) ) } else { imageView.image = UIImage(named: "image_not_found") } } }} 

这是我的HeaderImageView代码

 class HeaderImageVC: UIView { @IBOutlet weak var pageControl: UIPageControl! } extension HeaderImageVC : ProductImagesPageViewControllerDelegate { func setupPageController(numberOfPages: Int) { pageControl.numberOfPages = numberOfPages } func turnPageController(to index: Int) { pageControl.currentPage = index } } 

我不知道为什么代码不起作用,但是可以根据要求提供更多代码。 谢谢。

根据建议

 var images = (ProductServices.instance.productDetails.first?.productImg) lazy var controllers: [UIViewController] = { let storyboard = UIStoryboard(name: "Main", bundle: nil) var controllers = [UIViewController]() if let images = self.images { for image in images { let imageVC = storyboard.instantiateViewController(withIdentifier: PRODUCT_IMAGE_VC) controllers.append(imageVC) } } self.pageViewControllerDelegate?.setupPageController(numberOfPages: controllers.count) return controllers }() 

这仍然是空的

问题

 lazy var controllers: [UIViewController] = { let storyboard = UIStoryboard(name: "Main", bundle: nil) var controllers = [UIViewController]() // IT WILL NOT WAIT TO FINISH IT let productId = ProductServices.instance.selectedProduct?.id ProductServices.instance.findIndividualProducts(id: productId!, completion: { (success) in if success { ProductServices.instance.productDetails.forEach({ (productDetail) in // NO USE OF productDetail as it is already returned let images = productDetail.productImg.count if images > 0 { for image in 0..<(images) { let imageVC = storyboard.instantiateViewController(withIdentifier: PRODUCT_IMAGE_VC) controllers.append(imageVC) } } }) } }) // controllers.count is 0 self.pageViewControllerDelegate?.setupPageController(numberOfPages: controllers.count) return controllers }() 

如果您观察上面的代码并且您应该调试它,那么您会发现controllers是空的因为它是异步任务并且编译器不会等待完成findIndividualProducts任务来完成它将返回您已定义的空数组,因此结果是您的控制器没有什么可展示的! - >有意义

解决方法是,您可以创建一个简单的方法来设置调用API findIndividualProducts并将其分配给controllers现在控制器是简单的普通属性。

希望它有所帮助

编辑

首先创建一个方法并从视图调用它确实加载或视图将出现任何适合你的方法

  private func getAllControllers () { let storyboard = UIStoryboard(name: "Main", bundle: nil) var controllers = [UIViewController]() // IT WILL NOT WAIT TO FINISH IT let productId = ProductServices.instance.selectedProduct?.id ProductServices.instance.findIndividualProducts(id: productId!, completion: { (success) in if success { ProductServices.instance.productDetails.forEach({ (productDetail) in // NO USE OF productDetail as it is already returned let images = productDetail.productImg.count if images > 0 { for image in 0..<(images) { let imageVC = storyboard.instantiateViewController(withIdentifier: PRODUCT_IMAGE_VC) controllers.append(imageVC) } self.pageViewControllerDelegate?.setupPageController(numberOfPages: controllers.count) self.controllers = controllers } }) } }) } 

并从您的控制器属性中删除延迟块

var controllers: [UIViewController] = []