2015-04-25 3 views
2

Привет Я инициализацией ViewController используя этот код:Все IBOutlets равны нулю

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

После этого я перехожу к aboutViewController. Однако все мои IBOutlets на aboutViewController являются 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

извините за поздний ответ. Проблема возникает в aboutUSViewController. На основной плате я добавил метки и управление, которые перетащили их в aboutUSViewController. Я устанавливаю значение меток в viewdidload. Но у меня такая странная ошибка, что все выходы с метками нуль –

+0

Я нашел ответ. Вместо создания UIViewController я создал UIPageViewController –

ответ

15

Я предполагаю, что вы смотрите на выходы сразу после создания экземпляра сцены (вы также увидите это поведение, если используете segues и пытаетесь использовать выходы в 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) 

а затем viewDidLoad из AboutUsViewController будет использовать это чтобы заполнить выпуск соответственно:

override func viewDidLoad() { 
    super.viewDidLoad() 

    label1.text = message 
} 

Но у вас никогда не было бы, чтобы исходный контроллер представлений попытался установить/настроить выходы сцены назначения. Это ответственность AboutUsViewController.


Просто чтобы подтвердить, правильно ли подключены ваши розетки? На приведенном ниже рисунке показаны два способа подтверждения правильности подключения.

Когда вы выбираете контроллер вида в Interface Builder, а затем смотрите в инспекторе соединений, вы видите, что ваши розетки подключены туда? В следующем снимке, label1 подключен, но label2 не является:

enter image description here

Или, когда вы смотрите на свой код, и посмотреть на выходах, вы видите твердые точки в левом поле (имеется в виду розетка подключена) или пустые точки (означает, что розетка не подключена)?

enter image description here

+0

Привет, Rob, я использую библиотеку MMDrawer, чтобы иметь боковую панель! Поэтому я вообще не использую сегу. Я просто создаю viewcontroller и перемещаю его влево ... См. Выше, я отредактировал свой вопрос –

+0

Понял. (Я упомянул только о том, что они страдают от одинаковой проблемы и пытались помочь будущим читателям, которые споткнулись об этом вопросе.) Я хочу сказать, что одна из двух проблем возможна: либо вы используете выходы перед загрузкой представления (помните, что это не происходит, когда вы создаете экземпляр контроллера представления, но скорее это происходит позже, когда представление действительно представлено), или же выходы не были правильно подключены в IB. – Rob

+0

Rob У меня такая же проблема при использовании pageViewController. –

0

Я нашел ответ. Вместо создания UIViewController я создал UIPageViewController !!!

Смежные вопросы