【问题标题】:UIPageViewController + firebaseUIPageViewController + firebase
【发布时间】:2021-04-29 23:35:17
【问题描述】:

我正在使用 UIPageViewController 制作书籍页面,这些页面是将从 firebase 获取的图像。问题是我收到了这个错误

(无法将“books”类型的值转换为预期的元素类型“Array.ArrayLiteralElement”(又名“UIViewController”)

'books' 是我为 firebase 制作的结构


import Foundation
import Firebase

struct books {
    
    let bookId: String 
    let imageURL: String
}

extension booksC {
  init(_ dictionary: [String: Any]) {
    
    self.bookId = dictionary["bookId"] as? String ?? "no book id"
    self.imageURL = dictionary["imageURL"] as? String ?? "no image url"
  }
}

我正在使用这段代码,我的理解是我不能使用图像数组,我应该使用的是控制器数组,在这种情况下我不知道该怎么做。感谢您的帮助

import UIKit
import FirebaseFirestore


class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate  {

        let pageViewController = UIPageViewController(transitionStyle: .pageCurl, navigationOrientation: .horizontal, options: nil)


        private var pages  = [books]()
    
        private var listener: ListenerRegistration?

        override func viewDidLoad() {
            super.viewDidLoad()
            dataSource = self
            delegate = self

        // index

            guard  let pagesFirst = pages.last else { return }

            setViewControllers([pagesFirst], direction: .reverse, animated: true)
      
        //TODO: add listener


        }

        func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewController.SpineLocation {
            var location = SpineLocation.max
            if orientation == .landscapeLeft || orientation == .landscapeRight {
                self.pageViewController.isDoubleSided = true

                location = .mid
            }

            return location
        }

        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
            let index = self.pages.firstIndex(where: {$0 == viewController}) ?? 0
            if index == 0 { return nil }
            return pages[index - 1]

        }

        func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
            let index = self.pages.firstIndex(where: {$0 == viewController}) ?? 0
            if index == pages.count - 1 { return nil }
            return pages[index + 1]
        }

    }

class ImageViewController: UIViewController {


    let imageView = UIImageView()
    init(image: UIImage) {
        imageView.image = image
        super.init(nibName: nil, bundle: nil)
    }



    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(imageView)
        imageView.fillSuperview()
        imageView.contentMode = .scaleAspectFit
        imageView.clipsToBounds = true
        imageView.backgroundColor = .white


    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    public func setupImage(for book: books){
    imageView.kf.setImage(with: URL(string: book.imageURL))
}

}

【问题讨论】:

    标签: swift firebase uipageviewcontroller


    【解决方案1】:

    enter code here你在setViewControllers中使用你的数组private var pages = [books](),它期望UIViewController

    setViewControllers 是这样声明的:

    func setViewControllers(_ viewControllers: [UIViewController]?, 
                  direction: UIPageViewController.NavigationDirection, 
                   animated: Bool, 
                 completion: ((Bool) -> Void)? = nil)
    

    参数


    视图控制器

    要显示的视图控制器或视图控制器。

    方向

    导航方向。

    动画

    一个布尔值,指示是否要对过渡进行动画处理。

    我认为你应该创建一个ImageViewController 的实例,然后使用setupImage(for book: books) 设置图像(你可以访问它,因为它是一个公共方法,最后将该视图控制器分配给你的页面控制器:

    guard  let pagesFirst = pages.last else { return }
    let imageViewController = ImageViewController()
    imageViewController.setupImage(for book: pagesFirst)
    setViewControllers([imageViewController], direction: .reverse, animated: true)
    

    已编辑:

    对不起,就你得到的第二个错误来说,应该是

     imageViewController.setupImage(for:pagesFirst)
    

    至于是类外可用的名字。

    对于第一个错误,它为您提供了哪些初始化选项。应该是对的。

    也尝试以这种方式更改声明 imageView 的代码:

    var imageView : UIImageView = {
        let imageView = UIImageView()
        imageView.translatesAutoresizingMaskIntoConstraints = false // required if you need to work with autolayout
        return imageView
    }()
    

    删除:

     required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
    

    最后,你应该用大写 B 命名你的结构 book。

    【讨论】:

    • 感谢您的帮助。我在这里的代码有错误:让 imageViewController = ImageViewController() ->“在调用初始化程序时没有完全匹配”,这里是 imageViewController.setupImage(for book: pagesFirst) -->“表达式列表中的预期表达式”
    • 请检查答案
    • 谢谢第二个错误已解决。对于第一个错误,我得到“调用中参数'coder'的参数缺失”我试过 === private var imageViewController: ImageViewController init?(coder: NSCoder, imageViewController: ImageViewController) { self.imageViewController = imageViewController super.init(coder : coder) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } 但错误仍然存​​在。
    • 您的视图控制器在情节提要中吗?我不认为你需要` required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }` 您是否尝试将其从您的imageViewController 中删除
    • 否,但如果我没有添加它,我会收到一个错误“'必需的'初始化程序'init(coder:)'必须由'UIViewController'的子类提供”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多