2015-04-25 46 views
2

餵我的viewController初始化使用此代碼:所有IBOutlets是零

var aboutUsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("AboutUsViewController") as AboutUsViewController 

這個我搬到aboutViewController後。然而,我所有aboutViewController上的IBOutlets都是nil!爲什麼? 我正在使用MMDrawer庫以獲得側欄菜單。

var aboutUsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("AboutUsViewController") as AboutUsViewController 


     var aboutUsNavController = UINavigationController(rootViewController: aboutUsViewController) 

     var appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 

     appDelegate.centerContainer!.centerViewController = aboutUsNavController 
     appDelegate.centerContainer!.toggleDrawerSide(MMDrawerSide.Left, animated: true, completion: nil) 

在側欄我選擇關於我們的菜單項和我創造AboutViewController並將其移動到左側後...問題是,當我初始化我的控制器,出口是零

我使用pageViewController時也有這樣的問題:

class ViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 


let pageTitles = ["Title 1", "Title 2", "Title 3", "Title 4"] 
var images = ["long3","long4","long1","long2"] 
var count = 0 


var pageViewController : UIPageViewController! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    reset() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

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

func reset() { 
    /* Getting the page View controller */ 
    pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as UIPageViewController 
    self.pageViewController.dataSource = self 

    let pageContentViewController = self.viewControllerAtIndex(0) 
    self.pageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil) 

    /* We are substracting 30 because we have a start again button whose height is 30*/ 
    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height - 30) 
    self.addChildViewController(pageViewController) 
    self.view.addSubview(pageViewController.view) 
    self.pageViewController.didMoveToParentViewController(self) 
} 



func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 

    var index = (viewController as PageContentViewController).pageIndex! 
    index++ 
    if (index >= self.images.count){ 
     return nil 
    } 

    return self.viewControllerAtIndex(index) 
} 


func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
    var index = (viewController as PageContentViewController).pageIndex! 

    if index<=0 { 
     return nil 
    } 
    index-- 
    return self.viewControllerAtIndex(index) 
} 

func viewControllerAtIndex(index : Int) -> UIViewController? { 
    if((self.pageTitles.count == 0) || (index >= self.pageTitles.count)) { 
     return nil 
    } 
    let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageContentViewController") as PageContentViewController 

    pageContentViewController.imageName = self.images[index] 
    pageContentViewController.titleText = self.pageTitles[index] 
    pageContentViewController.pageIndex = index 
    return pageContentViewController 
} 

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

func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return 0 
    } 

} 



class PageContentViewController: UIPageViewController { 


@IBOutlet var imageViewMain: UIImageView! 

@IBOutlet var labelMain: UILabel! 

var pageIndex: Int! 
var titleText: String! 
var imageName: String! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.imageViewMain.image = UIImage(named:imageName) 
    self.labelMain.text = self.titleText 
    self.labelMain.alpha = 0.1 
    UIView.animateWithDuration(1.0, animations:{()-> Void in 
     self.labelMain.alpha = 1.0 
    }) 
    // Do any additional setup after loading the view. 
} 

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. 
    } 
    */ 

} 

我有問題,標籤和圖像出口零!我使用MMDrawer庫的問題也一樣。同樣的情況。我不使用segues!我認爲,因爲該網點是零

+0

你已經擴大它來顯示您如何使用'aboutUsViewController'(感謝),但如果您使用的視圖控制器這仍然是'nil'這個插座你不告訴我們。 'nil'哪個出口?這個問題發生在哪裏? – Rob

+0

對於最近的答案感到抱歉。這個問題出現在aboutViewViewController上。在主板上,我添加了標籤和控件,將它們拖入aboutViewViewController。我在viewdidload中設置標籤的值。但我有這個奇怪的錯誤,所有的標籤網點都沒有 –

+0

我找到了答案。而不是創造的UIViewController,我創建UIPageViewController –

回答

15

我假設你在實例化場景後立即查看網點(如果使用網格並嘗試使用prepareForSegue中的網點,也會看到此行爲)。但是直到演示/推送到該場景之後,插口才被連接,視圖被加載,並調用viewDidLoad

底線,不要試圖在調用viewDidLoad之前使用插座(即在實例化場景後不要立即使用插座)。相反,將所需數據傳遞到目標場景(例如String屬性),然後目的地的viewDidLoad應填充出口。

例如,你可能有一個屬性AboutUsViewController

var message: String! 

當你實例AboutUsViewController,你會設置該屬性:

let aboutUsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("AboutUsViewController") as AboutUsViewController // use `as!` in Swift 1.2 

aboutUsViewController.message = "some message" 

presentViewController(aboutUsViewController, animated: true, completion: nil) 

然後的AboutUsViewControllerviewDidLoad將使用物業相應地填充出口:

override func viewDidLoad() { 
    super.viewDidLoad() 

    label1.text = message 
} 

但是,您絕不會讓原始視圖控制器嘗試設置/調整目標場景的出口。這是AboutUsViewController的責任。


只是爲了確認,您的店鋪是否正確連接?下面顯示了兩種確認他們正確連接的方法。

當您在界面生成器中選擇視圖控制器,然後查看連接檢查器時,您是否看到您的插座連接在那裏?在下面的快照,label1掛起來,但label2是不是:

enter image description here

或者,當你在你的代碼,並期待在商店,你看到在左邊距實點(指出口被連接起來)還是空的點(意思是出口沒有連接起來)?

enter image description here

+0

您好羅布,我使用MMDrawer庫,以便有側邊欄!所以我根本不使用執行segue。我只是創建viewcontroller並將其移動到左側......參見上面,我編輯了我的問題 –

+0

瞭解。 (我只提到塞格斯,因爲他們從相同的問題的困擾,並試圖幫助誰碰到這個問題跌跌撞撞未來的讀者。)我的意思是說,兩個問題一個是可能的:要麼你正在使用的店鋪前的觀點是加載(請記住,當你實例化視圖控制器這_不_發生,而是發生後,當視圖卻出現),否則網點沒有得到妥善的IB掛鉤。 – Rob

+0

Rob我在使用pageViewController時遇到同樣的問題。 –

0

我找到了答案。而不是創建UIViewController,我創建了UIPageViewController!