2014-12-13 64 views
1

創建頁面動態使用這個代碼,它創建了一個關於的方式向下代碼1/3 PageViewController的UILabel - 意外地發現零而展開的可選值

import UIKit 

class PageViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

var pvc:UIPageViewController? 
var testArray: [String] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    pvc = UIPageViewController(
      transitionStyle: .Scroll, 
      navigationOrientation: .Horizontal, 
      options: nil) 

    // Make this object the datasource and delegate for the PageViewController 
    self.pvc?.delegate = self 
    self.pvc?.dataSource = self 

    // Populate an array of test content for the pages 
    testArray = ["Page 1", "Page 2", "Page 3"] 

    // Create an array of child pages 
    var swipePage:SwipePageController = SwipePageController() 
    println("Page view Controller: \(testArray[0])") 
    swipePage.name = testArray[0] 
    var pageArray: NSArray = [swipePage] 

    self.pvc?.setViewControllers(pageArray, direction: .Forward, animated: true, completion: nil) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
    let index:Int! = (viewController as SwipePageController).index! 

    if (index >= self.testArray.count){ 
     return nil 
    } 

    index + 1 

    return viewControllerAtIndex(index) 

} 

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
    let index:Int! = (viewController as SwipePageController).index! 

    if index == NSNotFound { 
     return nil 
    } 

    index - 1 

    return viewControllerAtIndex(index) 

} 

func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return self.testArray.count 
} 

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
    let page = self.pvc?.viewControllers[0] as SwipePageController 
    let name = page.name 
    return find(self.testArray, name!)! 
} 

func viewControllerAtIndex(index: Int) -> SwipePageController? 
{ 
    if self.testArray.count == 0 || index >= self.testArray.count 
    { 
     return nil 
    } 

    // Create a new view controller and pass suitable data. 
    let swipeView = SwipePageController() 
    swipeView.name = self.testArray[index] 
    swipeView.index = index 

    return swipeView 
} 

中的println(),不顯示我期望看到的價值。因爲我動態創建的視圖控制器的代碼是在這裏:

import UIKit 

class SwipePageController: UIViewController { 

// var to hold the var to display to the interface 
var name:String? 
var index:Int? 
@IBOutlet weak var testLabel: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    println(name!) 
    if let passedName = name? { 
     self.testLabel.text = passedName 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


/* 
// MARK: - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 
*/ 

}

的println(!名字)確實顯示正確的值也是如此。但是,我無法用值填充標籤。我得到以下錯誤:

「致命錯誤:意外發現零而展開的可選值」

我在我束手無策......我想不出有什麼不工作。另外,看到我的Xcode界面的屏幕截圖發生錯誤:

screen cap of Xcode interface

誰能幫助?

+1

看起來你的testLabel IBOutlet沒有連接任何東西。它在監視窗口中顯示爲零。你在使用故事板嗎? – 2014-12-13 19:11:08

+0

@MikeTaverne我正在使用故事板。如果你想看,我也可以包括它。 IBOutlet附加到標籤上(如果我將鼠標移到排水溝中的點上,則實際標籤會突出顯示)......這就是爲什麼這會讓人困惑... – 2014-12-13 19:15:27

+0

想到的唯一一件事就是讓確保在故事板中正確設置類名稱:在故事板中選擇視圖控制器,轉到「身份檢查器」並驗證「自定義類」下的「類名稱」設置爲「SwipePageController」。 – 2014-12-13 19:18:39

回答

1

我認爲問題是你實例化SwipePageController的方式。

取而代之的是:

var swipePage:SwipePageController = SwipePageController() 

試試這個:

var swipePage: SwipePageController = UIStoryboard(name: "YourStoryboardName", bundle: nil).instantiateViewControllerWithIdentifier("YourViewControllerId") 

替換「YourStoryboardName」與您的故事板文件的實際名稱,而「YourViewControllerId」與您的刷卡頁的故事板標識控制器。如果您尚未給出故事板ID,請務必在「身份檢查器」中進行設置。

+0

確實解決了錯誤。現在我可以解決其餘的問題了! :) 謝謝!!! – 2014-12-13 19:58:26

+0

它爲我工作,謝謝邁克:) – Marin 2017-01-12 20:36:59

相關問題