2014-08-21 6 views
2

Можно ли установить переменную в IBOutlet? У меня есть кнопка, которую я хочу отобразить в виде раскрывающегося списка. Выпадающее меню будет отличаться, если пользователь имеет учетную запись или является гостем. Я надеялся сделать следующее:Назначить переменную @IBOutlet UIView

class HomeViewController: UIViewController { 
    @IBOutlet weak var profileMenu: UIView! 
    @IBOutlet weak var guestMenu: UIView! 

    var currentMenu: UIView = self.profileMenu 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    if(user.registered){ 
     currentMenu = self.profileMenu 
    } else { 
     currentMenu = self.guestMenu 
    } 
    } 

    // toggle visibility on the currentMenu UIView 
    @IBAction func didClickProfileButton(sender: AnyObject) { 
    currentMenu.hidden = !currentMenu.hidden 
    } 
+0

Когда вы пробовали этот код, вы получили ожидаемый результат? –

+0

Нет, он жалуется, что HomeViewController не имеет члена с именем profileMenu, когда я пытаюсь его назначить. Эта строка конкретно: 'var currentMenu: UIView = self.profileMenu' – tehfailsafe

+0

Ну, это очень важная деталь, чтобы добавить к вашему вопросу тогда :) –

ответ

1

Проблема здесь не имеет ничего общего с @IBOutlet с или UIView с. Проблема заключается в том, как вы устанавливаете свои значения по умолчанию для переменных-членов.

Это не будет работать:

var profileMenu: UIView! 
var currentMenu: UIView = self.profileMenu 

Вы не можете ссылаться на себя в качестве значения по умолчанию, как, что, особенно, когда другая переменная-член не является даже еще присвоенного!

Вместо этого, почему бы не сделать currentMenu развернутым необязательным, и просто назначить его в viewDidLoad?

var currentMenu: UIView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    if(user.registered){ 
    currentMenu = self.profileMenu 
    } else { 
    currentMenu = self.guestMenu 
    } 
} 

Это должно работать, потому что viewDidLoad всегда будет вызываться, и if/else гарантирует, что он всегда назначает один из двух значений.

+0

Это сработало. Я объявлял «var currentMenu: UIView» без условного разворота и получения ошибок на уровне класса, заявив, что у него нет метода init. Поэтому я предположил, что для всех объявлений необходимо установить значение, иногда мне удавалось использовать 'nil', пока я не установил его в правильное значение в' viewDidLoad'. Мне нужно читать на развернутых опциях, я не совсем понимаю. Благодарю. – tehfailsafe

+0

'!' В типе означает: когда я читаю это значение, всегда предполагайте, что оно имеет значение. Но это значение по-прежнему разрешено быть «ноль». Это означает, что ваш класс может инициализировать и иметь это значение «nil». Но потом, прежде чем вы прочитаете форму этого свойства, вы установите его на реальное значение. И теперь вы можете прочитать эту переменную и предположить, что это не 'nil'. Это хорошая практика для всего, что вы настроите в 'viewDidLoad', но не' init'. –

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