2017-04-14 16 views
0

私はまだiOS開発の新人です。私はimagesの値をbanner(データモデル)に入れたいと考えています。だから、すべての値を取得するにはfunc getAllBannerと呼ぶ必要があります。その後、func turnToPageとのみ呼ばれます。私はデバッグする場合Funcが正しく実行されない(Swift 3)

問題はlet controller = controllers[index]あるが

fatal error: Index out of range

ですが、私は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") 
        } 
       } 
      } 
     } 
    } 
+0

、あなたのself.imagesはあなたのコントローラをループコントローラオーバーÖzgü[email protected] –

+0

ができますないループすることはできませんので、空になっていますか?あなたの提案は何ですか? – Sariyanti

+0

イメージを配列に追加し、forループの外にプロパティを設定し、すべてのイメージをロードした後、つまりforループの外側に 'self.turnToPage(index:0)'を呼び出す必要があります。 – srvv

答えて

0

このスニペットを使用できます。あなたは、コントローラの配列を設定するとき

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 
     } 
    } 
} 
関連する問題