У меня есть пользовательский UIView (называемый GridView), который я инициализирую, а затем добавляю в ViewController (DetailViewController). GridView содержит несколько UIButtons, и я хотел бы знать в DetailViewController, когда эти кнопки касаются. Я новичок в Swift, и мне интересно, какой лучший образец использовать для получения этих событий?Swift: Лучший способ получить значение из вида
ответ
Если вы хотите сделать это с помощью уведомлений, используйте 1:
func postNotificationName(_ notificationName: String,
object notificationSender: AnyObject?)
в методе, который запускается по кнопке. Затем, в вашем DetailViewController
, добавить слушателя, когда она инициализируется с 2:
func addObserver(_ notificationObserver: AnyObject,
selector notificationSelector: Selector,
name notificationName: String?,
object notificationSender: AnyObject?)
Обе функции могут быть вызваны из NSNotificationCenter.defaultCenter()
.
Другим методом было бы добавить обратные вызовы, которые вы подключаете после инициализации GridView
в DetailViewController
. Обратный вызов является, по существу, закрытием:
var callback : (() -> Void)?
, который вы можете создать при необходимости, например.
// In DetailViewController initialization
gridView = GridView()
gridView.callback = { self.doSomething() }
В GridView
вы можете вызвать функцию обратного вызова, как это:
func onButton()
{
callback?()
}
Обратный вызов будет только выполнять, если разворачивание успешно. Убедитесь, что вы прочитали Automatic Reference Counting, потому что эти конструкции могут привести к сильным опорным циклам.
В чем разница? Вы можете подключить обратный вызов только один раз (по крайней мере, с помощью метода, который я показал здесь), но когда он запускается, приемник немедленно выполняет свой код. Для уведомлений вы можете иметь несколько приемников, но есть некоторая задержка в доставке событий.
Спасибо! Я не знал о обратных вызовах. Оба варианта кажутся жизнеспособными. – colindunn
Вы также можете сделать «делегат», если у вас много кнопок, которые имеют смысл, это может быть более полезным, чем подключение большого количества обратных вызовов. –
Я думаю, вам лучше создать класс под названием GridView
, который унаследован от UIView
. Затем вы можете подключить все элементы UI к вам классом, как IBOutlet
, или что-то вроде тега. Позже вы можете запросить экземпляр GridView
в DetailViewController
, чтобы вы могли подключиться как IBAction
.
Инкапсуляция является одним из принципов ООП.
Давайте предположим, что ваш GridView реализация, как выглядит следующим образом:
class GridView : UIView {
// Initializing buttons
let button1:UIButton = UIButton(...)
let button2:UIButton = UIButton(...)
// ...
// Adding buttons to view
self.addSubview(button1)
self.addSubview(button2)
// ...
}
Теперь мы добавим методы селекторов, которые будут вызываться при касании кнопки. Давайте предположим, реализация вашего контроллера представления, как выглядит следующим образом:
class DetailViewController : UIViewController {
let myView:GridView = GridView(...)
myView.button1.addTarget(self, action: "actionForButton1:", forControlEvents: UIControlEvents.TouchUpInside)
myView.button2.addTarget(self, action: "actionForButton2:", forControlEvents: UIControlEvents.TouchUpInside)
// ...
func actionForButton1(sender: UIButton!) {
// Your actions when button 1 is pressed
}
// ... Selectors for other buttons
}
Я должен сказать, что мой пример подход не хорошим примером для инкапсуляции принципов объектно-ориентированного программирования, но я написал так, потому что вы новичок в Swift, и этот код легко понять. Если вы хотите предотвратить дублирование кодов, таких как написание разных селекторов для каждой кнопки, и если вы хотите, чтобы свойства вашего представления были приватными, чтобы предотвратить доступ извне, как это я делал только в DetailViewController, есть гораздо лучшие решения. Надеюсь, это просто поможет вам!
- 1. Лучший способ получить строку из вида Razor
- 2. Лучший способ получить одно значение из DataTable?
- 3. Лучший способ получить правильное значение
- 4. Marionette - Есть ли лучший способ получить itemViewContainer из составного вида
- 5. Лучший способ получить значение переменных
- 6. Реагировать лучший способ получить значение
- 7. Swift: Лучший способ фильтрации массива
- 8. рубин лучший способ, чтобы получить альтернативное значение
- 9. Лучший способ получить конкретное значение узла XML?
- 10. Лучший способ получить статическое значение DateTime
- 11. Лучший способ получить значение слова онлайн программно
- 12. Лучший способ получить значение атрибута из HTML текста
- 13. Есть ли лучший способ получить значение из блока в Ruby?
- 14. Django: лучший способ получить значение ForeignKey из шаблона
- 15. Лучший способ получить значение из коллекции по индексу
- 16. Лучший способ получить значение из html в python?
- 17. Есть ли лучший способ получить значение из jQuery.each()?
- 18. Лучший способ получить двойное значение из datetime в jquery
- 19. Лучший способ получить одно значение из запроса, возвращающего xml?
- 20. Лучший способ получить значение из кортежа в C#
- 21. Лучший способ обрабатывать временное значение в swift с помощью coredata
- 22. В Swift есть лучший способ инициализировать переменную «получить»?
- 23. Лучший способ передать значение индекса между функциями в Swift
- 24. Swift - лучший способ обработки словаря словарей?
- 25. Swift Получить значение из функции
- 26. Лучший способ получить переменную из другого скрипта
- 27. Лучший способ захватить одно значение из таблицы?
- 28. Лучший способ вернуть значение из скрипта python
- 29. лучший способ вызвать функцию из вида в laravel
- 30. Получить значение SharedPreferences из другого вида деятельности
Кажется, что NSNotificationCenter будет одним из способов. Любые конкретные советы о том, как реализовать, будут оценены. – colindunn