我正在开发一个iOS应用程序,它使用alamofire和swiftyJSON与API进行交互。在这个api中,我得到了一堆返回的值,其中一个是图像。返回的图像以数组的形式出现,但我能够遍历数组并显示单个图像。为了使应用程序更高级,我决定在我的应用程序中实现 UIPageViewController 类。我调用了API函数并试图将我的图像传递给视图控制器。
我的故事板中的内容列表
据我所知,我的代码很好,但是当我运行应用程序时,控制台上没有任何反应。以下是我的代码。
form = cgi.FieldStorage()
for name in form.keys():
if name.lower() == 'userpwd':
form_data[name] =
hashlib.sha512(form.getfirst(name).encode('utf-
8')).hexdigest()
else:
form_data[name] = form.getfirst(name)
if not 'uname' in form_data:
print('The username should not be empty')
elif not 'userpwd' in form_data:
print('Le mot de pass ne doit pas être vide.')
elif form_data['uname'] == data['username'] and
form_data['userpwd'] == data['userpwd']:
print("Bonjour %s %s !" % (data['firstname'],
data['lastname']))
else:
print('Le nom d\'utilisateur et le mot de pass sont invalides.')
这是我的ImageVC代码
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)
}
}
}
这是我的HeaderImageView代码
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")
}
}
}}
我不知道为什么代码不能正常工作,但会根据要求提供更多代码。感谢。
根据建议
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
}
}
这仍然是空的
答案 0 :(得分:1)
问题
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
任务完成它将返回你定义的空数组,所以结果是你的控制器没有任何显示! - &GT;有意义
解决方法很简单,你可以创建一个方法来设置调用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] = []