Кнопка заметно видна, но событие не регистрируется
Swift 3/iOS 10/Xcode 8
У меня есть контроллер представления (pieChart), который содержит метку, две кнопки и пустой вид (который будет содержать круговую диаграмму). Метка и две кнопки включены в горизонтальный вид стека, который находится над круговой диаграммой.
Приведенный выше VC встроен в одно из четырех представлений контейнера (главный экран приложения состоит из этих четырех представлений контейнера) при запуске приложения.
В pieChart я связал обе кнопки с соответствующими IBActions и IBOutlets. При нажатии на кнопку 2 модальный переход должен происходить с другим VC, но этого не происходит. Видимо, кнопка регистрирует щелчок - т.е. она меняет цвет при нажатии. Я поместил оператор print в метод IBAction для кнопки 2, но он тоже не отображается. В консоли также не отображаются сообщения об ошибках.
Единственные причины этого, которые я обнаружил после нескольких часов охоты:
дополнительные виды были добавлены к самой кнопке, поэтому сигнал события щелчка проходит по кнопке, которая будет принята дополнительными дополнительными видами. Это не тот случай для меня. Порядок - главное окно приложения> Вид контейнера> Встроенный виртуальный канал> Вид стека> Кнопка. InteractionEnabled имеет значение true для всех.
Кнопка частично находится вне содержащего вида (ее высота / ширина может быть больше, чем у содержащего ее вида). Это не тот случай для меня. Вид стека, метка и обе кнопки имеют одинаковую высоту, а ширина стека равна сумме ширины метки и кнопок плюс расстояние между меткой и кнопками.
Я также попытался добавить обработчик событий программно с:
SelectAnalyisButtonOutlet.addTarget(self, action: #selector(SelectAnalysisButtonClicked), for: .touchUpInside)
но тот же результат происходит.
Существуют ли какие-либо другие причины, по которым события кликов, по-видимому, не регистрируются?
РЕДАКТИРОВАТЬ 1
Упомянутый выше pieChart VC - это один из нескольких VC, которые выгружаются из одного и того же представления контейнера (называемого detailContainerView), в зависимости от того, какая кнопка (все из которых работают очень хорошо) нажата в одном из других представлений контейнера (называемого TabBar).
Я поместил кнопку в каждом из двух других VC, которые отображаются в detailContainerView, и подключил их к IBAction. Каждый IBAction содержит оператор печати, который срабатывает при нажатии кнопки. На данный момент эти два ВК состоят только из метки и вновь вставленных кнопок. Ни одна из кнопок не работала, когда я запустил приложение.
Затем я установил один из VC detailContainerView в качестве начального контроллера представления в Инспекторе атрибутов и перезапустил приложение. Внезапно кнопки теперь работают! Если я потом подключу кнопки к переходу, переходы тоже будут работать!
Что-то, кажется, меняется, когда я поменяю VC в detailContainerView. Код, который я использую для замены VC, выглядит следующим образом:
func SwapOutControllers(vc: UIViewController, vcName: String){
//REMOVE OLD VC
detailPaneVCReference?.willMove(toParentViewController: nil)
detailPaneVCReference?.view.removeFromSuperview()
detailPaneVCReference?.removeFromParentViewController()
var newVc: UIViewController?
switch vcName {
case "Biography":
newVc = vc as! Biography
case "Social Media":
newVc = vc as! SocialMedia
case "News Feed":
newVc = vc as! NewsFeeds
case "Stats":
newVc = vc as! StatsAboutParliament
case "Petitions":
newVc = vc as! Petitions
default:
print("Error: No VC Found!")
}
//ADD NEW VC
ParentVC?.addChildViewController(newVc!)
let width = detailContainerView?.frame.width
let height = detailContainerView?.frame.height
newVc?.view.frame = CGRect(x: 0, y: 0, width: width!, height: height!)
detailContainerView?.addSubview((newVc?.view)!)
newVc?.didMove(toParentViewController: ParentVC)
}
detailPaneVCReference является ссылкой на то, какой виртуальный канал в данный момент отображается в detailContainerView. ParentVC - это VC, который содержит четыре представления контейнера.
VC, который удален из ParentVC, все еще существует в иерархии представления отладки после того, как он был удален / заменен - может ли это каким-то образом блокировать событие click от достижения обработчика событий?
РЕШЕНИЕ!
Источником моей проблемы было то, что ссылки, которые я сделал на каждый из контроллеров представления, которые включаются и выключаются в detailContainerView, были ошибочно объявлены как слабые ссылки. Я удалил "слабый" (например, "слабый var x: UIViewController?" -> "var x: UIViewController?") Из каждого объявления и вуаля! Код теперь работает как задумано!
1 ответ
Источником моей проблемы было то, что ссылки, которые я сделал на каждый из контроллеров представления, которые включаются и выключаются в detailContainerView, были ошибочно объявлены как слабые ссылки. Я удалил "слабый" (например, "слабый var x: UIViewController?" -> "var x: UIViewController?") Из каждого объявления и вуаля! Код теперь работает как задумано!