繁体   English   中英

Func无法正确执行(Swift 3)

[英]Func not execute properly (Swift 3)

我仍然是iOS开发的新手。 我的想法是我要从banner (数据模型)中放入images值。 因此,我需要调用func getAllBanner来获取所有值。 然后仅称为func turnToPage

问题是let controller = controllers[index]

致命错误:索引超出范围

调试时,我注意到了lazy var controllers: [UIViewController] 这是为什么 ?

任何帮助都非常感谢。

var images: [UIImage]?

var banner: [Banner]?

 //  Variable that not create onDidLoad
    lazy var controllers: [UIViewController] = {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        var controllers = [UIViewController]()

        if let images = self.images {
            for image in images {
                let sliderImageVC = storyboard.instantiateViewController(withIdentifier: Storyboard.sliderImageViewController)

                controllers.append(sliderImageVC)
            }
        }
        self.pageViewControllerDelegate?.setupPageController(numberOfPages: controllers.count)

        return controllers
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        automaticallyAdjustsScrollViewInsets = false
        dataSource = self
        delegate = self

        self.getAllBanner(strAppID: "1", locationid: "2")
        self.turnToPage(index: 0)
    }


//  To allow to turn page
    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.configureViewDisplaying(viewController: controller)

        setViewControllers([controller], direction: direction, animated: true, completion: nil)
    }


//  Get Banner
    func getAllBanner(strAppID: String, locationid: String) {
        Banner.getBanner(strAppID: strAppID, locationID: locationid) { [weak self] banner in
            guard let `self` = self else {
                return
            }
            self.banner = banner

            //  Update UI here
            if let banners = self.banner {
                for banner in banners {
                    let endPoint = URL(string: banner.ImageURL)
                    do {
                        let data = try Data(contentsOf: endPoint!)
                        self.images = [UIImage(data: data)!]
                    } catch {
                        print("Error")
                    }
                }
            }
        }
    }

您可以使用此代码段。

func getAllBanner(strAppID: String, locationid: String) {
    Banner.getBanner(strAppID: strAppID, locationID: locationid) { [weak self] banner in
        guard let `self` = self else {
            return
        }

         self.banner = banner

        //  Update UI here
        if let banners = self.banner {
            var images: [UIImage] = []
            for banner in banners {
                let endPoint = URL(string: banner.ImageURL)
                do {
                    let data = try Data(contentsOf: endPoint!)
                    images.append(UIImage(data: data)!)
                } catch {
                    print("Error")
                }
            }
          self.images = images
          // call turnpage method here 
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM