2017-01-13 61 views
0

訪問的ViewController部件我有2簡單視圖如下如何從PageViewController

enter image description here

第一個是網頁瀏覽第二個是簡單的viewController在頂部

的viewController碼的圖像視圖如下

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.backgroundColor = UIColor.white 
     imgView.image = UIImage(named: "dog0") 
    } 
} 

當我運行這個視圖控制器作爲初始視圖控制器。它工作正常。它顯示的圖像正常

但是當我做從頁面視圖控制器相同的用下面的代碼

class PageViewController: UIPageViewController, UIPageViewControllerDataSource { 

    let imageNames = ["dog0","dog1","dog2"] 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.dataSource = self 
     let eachView = ViewController() 
     eachView.imageName = imageNames.first 
     let viewControllers = [eachView] 
     setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil) 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     return nil 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     return nil 
    } 


} 

class ViewController: UIViewController { 
    var imageName : String? { 
     didSet { 
      imgView.image = UIImage(named: imageName!) 
     } 
    } 
    @IBOutlet weak var imgView: UIImageView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.backgroundColor = UIColor.white 
    } 
} 

我得到以下錯誤

fatal error: unexpectedly found nil while unwrapping an Optional value 

line

imgView.image = UIImage(named: imageName!) 

什麼問題&如何解決這個問題?

回答

1

問題是這樣的線:

let eachView = ViewController() 

此創建的ViewController實例「無中生有」,沒有任何相關聯的主view。因此,當視圖加載時,它是空的。因此,視圖中沒有圖像視圖,並且imgViewnil。因此,當您參考imgView就好像它不是nil(嘗試設置它的image)時,就會崩潰。

正確的程序是實例化您在故事板中設計了的ViewController。 因爲你設計了它(你放在那裏),並且它有一個imgView插座,正如你已經知道的那樣,因爲你設計了它(你把它放在那裏),所以它的view中有一個圖像視圖。

爲了獲得視圖控制器實例,讓故事板(大概爲self.storyboard)的引用,並調用instantiateViewController(withIdentifier:)。當然,你必須爲故事板中的ViewController實例指定一個標識符。

然後,你需要重寫的ViewController是這樣的:

class ViewController: UIViewController { 
    var imageName : String? { 
     didSet { 
      imgView?.image = UIImage(named: imageName!) 
     } 
    } 
    @IBOutlet weak var imgView: UIImageView? // note the question mark 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.backgroundColor = UIColor.white 
     imgView?.image = UIImage(named: imageName!) // note the repeat 
    } 
} 

的原因是,你現在有一個計時問題:在視圖加載之前要設置imageName,所以imgView仍然尚未掛接到它的出口。通過將關鍵線移動到viewDidLoad,您確定我們在之後執行此操作我們實際上有一個視圖和一個出口。

+0

我該如何解決這個問題? – LynAs

+0

@LynAs我想我現在已經提供了足夠的解釋!如果您還有其他問題,請告訴我。 – matt

+0

我正在實例化視圖控制器這樣'let eachView = self.storyboard?.instantiateViewController(withIdentifier:「imageScroller」)as! ViewController'仍然收到相同的錯誤。你能告訴我爲什麼嗎?? – LynAs

相關問題