2015-05-05 4 views
0

Я хочу скрыть свой IBOutlet. Однако установка текста в строку empy отлично работает, но когда я получаю непосредственно свой IBOutlet, я все время получаю ошибку, которая «неожиданно обнаружила нуль при разворачивании необязательного значения».Swift: Как установить IBOutlet с другого контроллера?

Я попытался установить свой IBOutlet в локальный varialble, но он также дает ошибку. Я подготовил некоторые фрагменты кода, не относящимися к линиям удаленных только лучше выставить мою проблему без предоставления слишком много коды:

PageContentViewController

@IBOutlet weak var LabelTop: UILabel! 
var Test:UILabel! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    self.LabelTop = self.Test 
} 

PageViewController

func viewControllerAtIndex(index: Int)-> PageContentViewController?{ 

    if((self.pageTitles.count == 0) || (index >= self.pageTitles.count)) 
    { 
     return nil 
    } 

    var pageContentViewController: PageContentViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageContentViewController") as! PageContentViewController 
    pageContentViewController.imageFile = self.pageImages[index] 
    pageContentViewController.titleText = self.pageTitles[index] 
    pageContentViewController.pageIndex = index 
    if(index == 2){ 

    pageContentViewController.Test.hidden = true 
    } 
    else { 
     pageContentViewController.Test.hidden = false 
    } 

    return pageContentViewController 

} 

программы падает при попытке для доступа к инструкции UIlabel in if. Очевидно, как я уже говорил, я могу легко получить доступ к текстовому свойству и установить его в пустую строку, но мне интересно, почему IBOutlet недоступен таким образом.

Заранее благодарен!

ответ

1

Проблема, которую вы получаете, заключается в том, что в методе viewControllerAtIndex вы пытаетесь установить розетку, но контроллер вида (PageContentViewController) не был загружен в иерархию представлений, так что выход по-прежнему равен нулю.

Один из раствора можно использовать это добавить свойство к PageContentViewController, например isHidden и viewDidAppear проверить, что свойство и скрыть вид или показать:

var isHidden:Bool = true 
override func viewDidAppear(animated: Bool) { 
    superviewDidAppear(animated) 

    self.Test.hidden = isHidden 
} 

в методе viewControllerAtIndex изменить линии, установить скрытое свойство тестового контроля в IsHidden:

if(index == 2){ 

    pageContentViewController.isHidden = true 
    } 
    else { 
     pageContentViewController.isHidden = false 
    } 
+0

Теперь ошибка возникает в self.Test.hidden = isHidden – DCDC

+0

@DCDC, какую ошибку вы получаете? Вы создали тестовую метку? Я вижу, что LabelTop является Outlet, поэтому вы добавили его в IB, но Test не IBOutlet, поэтому я предполагаю, что вы создали его перед запуском viewDidAppear. – Greg

+0

Хорошо, эта тестовая переменная - это то, что бесполезно. Когда я получаю доступ к UIlabel непосредственно self.LabelTop ошибка больше не происходит – DCDC

1

Вы объявили " var Test:UILabel! ", который not optional, так что в этом с ase, сначала вы должны его инициализировать. Вы можете напрямую обращаться к своим свойствам без инициализации, это невозможно.

Либо вам нужно создать тест как " var Test:UILabel? ", а затем создать тест программно и установить все остальные свойства, такие как текст и все.

ИЛИ вы можете создать Boolean variable в своем следующем классе PageContentViewController, установите Логическое значение переменной вместо установки " pageContentViewController.Test.hidden " значение, то после того, как в PageContentViewController скрыть/показать этикетку.

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