2015-05-07 5 views
1

Я добавил элемент кнопка бар программно в контроллере представления:Как назначить IBOutlet программно с помощью Swift?

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Menu", style: .Plain, target: nil, action: nil) 
} 

Теперь я хочу, чтобы назначить эту кнопку бар элемент на IBOutlet программно. Как мне это сделать с помощью Swift?

+1

'IB'' IBOutlet' означает ** I ** nterface ** B ** uilder и представляет собой соединение от конструктора интерфейса к исходному коду. Назначение «IBOutlet» программно не могло иметь меньшего смысла. Что вы на самом деле пытаетесь сделать? – nhgrif

ответ

12

В IB из IBOutlet стенд для I nterface B uilder и представляет соединение от интерфейса строителя к исходному коду. Присвоение IBOutlet программным способом не могло иметь меньшего смысла.

IBOutlet - это просто переменная экземпляра класса, которая привязана к части интерфейса или может быть установлена ​​через построитель интерфейса. Если нам нужна ссылка на нашу кнопку (точно так же мы будем ссылаться на нее, если бы сделали ее в построителе интерфейса), мы просто добавляем свойство к нашему классу и затем назначаем нашу вновь созданную кнопку:

class MyViewController: UIViewController { 

    var someBarButton: UIBarButtonItem? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.someBarButton = UIBarButtonItem(title: "Menu", style: .Plain, target: nil, action: nil) 
     self.navigationItem.leftBarButtonItem = self.someBarButton 
    } 
} 

И теперь, someBarButton наш "IBOutlet".


Некоторые заметки ...

Там довольно приличный шанс, что мы не могли бы на самом деле хотят, чтобы делать вещи таким образом.

Это создает дополнительную крепкую ссылку на кнопку (self.navigationItem уже имеет прочную ссылку на ее leftBarButtonItem).

Вы заметите, что если вы создали IBOutlet из конструктора интерфейса, он настроен как свойство weak. Так что, возможно, нам нужна слабая собственность?

Но мы можем на самом деле сделать себя лучше. Попробуйте это для размера:

var leftNavBarButton: UIBarButtonItem? { 
    get { 
     return self.navigationItem.leftBarButtonItem 
    } 
    set (newValue) { 
     self.navigationItem.leftBarButtonItem = newValue 
    } 
} 

Теперь self.leftNavBarButton существу просто удобный способ доступа к self.navigationItem.leftBarButtonItem.

1

Вы хотите назначить действие кнопке в коде вместо IB. Ваш вопрос сформулирован несколько запутанным образом, но неважно.

Вы используете аргументы и action конструктора UIBarButtonItem. target - ваш контроллер, обычно self; action - это строка, которая является селекторной сигнатурой вашего обработчика кнопок, содержащейся в этом контроллере.

self.someBarButton = UIBarButtonItem(title: "Menu", style: .Plain, 
     target: self, action: "buttonHandler:") 
Смежные вопросы