2016-09-16 5 views
3

AlamofireでGETリクエストをしようとすると問題が発生します。私のviewDidLoadメソッドです。私はすでに私の要求が動作していることを確認し、配列にデータが格納されていることを確認しましたが、コードを実行すると致命的なエラーが出ます:getViewControllerAtIndexメソッドを呼び出すと、 APIからのデータを使用してUIPageViewControllerを作成するにはどうすればよいですか。 APIリクエスト後にUIPageViewControllerを更新する正しい方法

import UIKit 
import Foundation 
import Alamofire 


class ViewController: UIPageViewController, UIPageViewControllerDataSource { 

    var arrPageTitle = [String]() 
    var arrPagePhoto = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let guidesEndpoint: String = "http://testapi.eu-gb.mybluemix.net/guides" 

     Alamofire.request(guidesEndpoint).responseJSON { (response) in 

      if let JSON = response.result.value { 

       //print("JSON: \(JSON)") 

       if let guides = JSON as? [String : AnyObject] { 

        if let guideResourceList = guides["_embedded"] as? [String : AnyObject] { 

         //print(guideResourceList) 
         if let guidesArray = guideResourceList["guideResourceList"] as? [AnyObject] { 

          for guide in guidesArray { 

           if let guideGuide = guide["guide"] as? [String : AnyObject] { 
            if let textItem = guideGuide["text"] as? String { 
             // Populate arrPageTitle 
             self.arrPageTitle.append(textItem) 
             print(textItem) 
            } 

           } 

           if let guideLinks = guide["_links"] as? [String : AnyObject] { 
            if let linksObj = guideLinks["imageUrl"] as? [String : String] { 
             if let link = linksObj["href"] { 
              // Populate arrPagePhoto 
              self.arrPagePhoto.append(link) 
              print(link) 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     self.dataSource = self 
     self.setViewControllers([getViewControllerAtIndex(0)] as [UIViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil) 
    } 

    // Use this method to return to previous view. In this I have put a condition such that if it is first view then return nil otherwise return ViewController. 
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 

     let pageContent: PageContentViewController = viewController as! PageContentViewController 
     var index = pageContent.pageIndex 
     if index == 0 || index == NSNotFound { 
      return nil 
     } 
     index -= 1 

     return getViewControllerAtIndex(index) 
    } 

    // MARK:- UIPageViewControllerDataSource Methods 

    // Use this method to return next view. In this I have put a condition such that if it is last view then return nil otherwise return ViewController. 
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 

     let pageContent: PageContentViewController = viewController as! PageContentViewController 
     var index = pageContent.pageIndex 
     if index == NSNotFound { return nil } 
     index += 1 
     if index == arrPageTitle.count { return nil } 

     return getViewControllerAtIndex(index) 
    } 



    // MARK:- Custom Methods 

    func getViewControllerAtIndex(_ index: Int) -> PageContentViewController { 

     // Create a new view controller and pass suitable data. 
     let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController 

     // fatal error: Index out of range 
     pageContentViewController.strTitle = "\(arrPageTitle[index])" 
     pageContentViewController.strPhotoName = "\(arrPagePhoto[index])" 
     pageContentViewController.pageIndex = index 
     pageContentViewController.numberOfPages = arrPagePhoto.count 
     print("\(arrPagePhoto.count)") 

     return pageContentViewController 

    } 

} 

ViewController.swift

のこの私のコードでは、これが私のPageContentViewController.swift

import UIKit 

class PageContentViewController: UIViewController { 

    @IBOutlet weak var lblTitle: UILabel! 
    @IBOutlet weak var imageView: UIImageView! 
    @IBOutlet weak var pageControl: UIPageControl! 

    var pageIndex: Int = 0 
    var strTitle: String! 
    var strPhotoName: String! 
    var numberOfPages: Int! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     imageView.image = UIImage(named: strPhotoName) 
     lblTitle.text = strTitle 
     pageControl.currentPage = pageIndex 
     pageControl.numberOfPages = numberOfPages 

    } 

} 

任意のアイデアです?

答えて

1
self.setViewControllers([getViewControllerAtIndex(0)] as [UIViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil) 

このスコープの外ではなく、alamofireコールバックで呼び出す必要があります。 setViewControllerAtIndexを呼び出しているところで、(arrPageTitle)からデータを取り込む配列は空白になり、インデックスで配列の値にアクセスしているときに、範囲外エラーが発生します。

あなたが何をしたいかに応じて、場合-スコープ

if let guidesArray = guideResourceList["guideResourceList"] as? [AnyObject] { 
    //parsing code... 
    self.setViewControllers([getViewControllerAtIndex(0)] as [UIViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil) 

} 

またはのためのループ内でこの年末で関数を呼び出す必要があります。

+0

ああ、完璧です、今はうまくいきます。ありがとう@Moriya –

関連する問題