问题描述
我正在开发一个iOS应用程序,该应用程序使用alamofire和swiftyJSON与API进行交互.在此api中,我得到了一堆返回的值,其中一个是图像.返回的图像以数组的形式出现,但是我能够遍历数组并显示单个图像.为了使应用程序更高级,我决定在应用程序中实现 UIPageViewController 类.我调用了API函数,并试图将我的图像传递到视图控制器中.
I am working on an iOS application which interacts with an API using alamofire and swiftyJSON. In this api I get a bunch of values returned and one of them is images. the Images returned comes in form of an array but i am able to iterate through the array and display a single image. To make the application more advanced, I decided to implement UIPageViewController class in my application. I called the API function and tried to pass my images into view controllers.
我的故事板上的事物列表
- UIPageView
- 一个嵌入了UIImage的UiViewController.
据我所知,我的代码很好,但是当我运行该应用程序时,控制台上什么也没有发生.下面是我的代码.
I have my codes fine to the best of my knowledge but when I run the application nothing happens on in the console. Below is my codes.
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..<(images) {
let imageVC = self.storyboard?.instantiateViewController(withIdentifier: PRODUCT_IMAGE_VC)
self.controllers.append(imageVC!)
}
}
})
}
})
}
lazy var controllers: [UIViewController] = {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
var controllers = [UIViewController]()
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..<(images) {
let imageVC = storyboard.instantiateViewController(withIdentifier: PRODUCT_IMAGE_VC)
controllers.append(imageVC)
}
}
})
}
})
self.pageViewControllerDelegate?.setupPageController(numberOfPages: controllers.count)
return controllers
}()
func turnToPage(index: Int)
{
let controller = controllers[index]
var direction = UIPageViewControllerNavigationDirection.forward
if let currentVC = viewControllers?.first {
let currentIndex = controllers.index(of: currentVC)!
if currentIndex > 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代码
This is my ImageVC code
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代码
This is my HeaderImageView code
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
}
}
我不知道为什么该代码不起作用,但可以根据要求提供其他代码.谢谢.
I have no idea why the code is not working but further codes would be supplied on request. Thanks.
根据建议
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
任务完成,它将返回您所用的空数组已经定义,所以结果是您的控制者无事可做! ->有道理
if you observe above code and you should debug it, then you will find that controllers
is empty Because it is async task and compiler will not wait for finish findIndividualProducts
task to complete it will return the empty array which you have define so outcome is your controller has nothing to show !! -> Make sense
解决方案就是这么简单,您可以创建方法来设置调用API findIndividualProducts
并将其分配给controllers
,因为控制器现在是简单的普通属性.
Solution is that simple you can create method that will set the call the API findIndividualProducts
and assign it to the controllers
now the controller is simple plain property.
希望对您有帮助
编辑
首先创建一个方法,并在加载后视图中调用它,否则视图将以适合您的方式出现
First create one method and call it from view did load or view will appear whatever suits you
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
}
})
}
})
}
并从控制器属性中删除惰性块
and remove lazy block from your controller property
var controllers: [UIViewController] = []
这篇关于从API传递的图片未显示在综合浏览量容器中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!