Кнопка заметно видна, но событие не регистрируется

Swift 3/iOS 10/Xcode 8

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

Приведенный выше VC встроен в одно из четырех представлений контейнера (главный экран приложения состоит из этих четырех представлений контейнера) при запуске приложения.

В pieChart я связал обе кнопки с соответствующими IBActions и IBOutlets. При нажатии на кнопку 2 модальный переход должен происходить с другим VC, но этого не происходит. Видимо, кнопка регистрирует щелчок - т.е. она меняет цвет при нажатии. Я поместил оператор print в метод IBAction для кнопки 2, но он тоже не отображается. В консоли также не отображаются сообщения об ошибках.

Единственные причины этого, которые я обнаружил после нескольких часов охоты:

  1. дополнительные виды были добавлены к самой кнопке, поэтому сигнал события щелчка проходит по кнопке, которая будет принята дополнительными дополнительными видами. Это не тот случай для меня. Порядок - главное окно приложения> Вид контейнера> Встроенный виртуальный канал> Вид стека> Кнопка. InteractionEnabled имеет значение true для всех.

  2. Кнопка частично находится вне содержащего вида (ее высота / ширина может быть больше, чем у содержащего ее вида). Это не тот случай для меня. Вид стека, метка и обе кнопки имеют одинаковую высоту, а ширина стека равна сумме ширины метки и кнопок плюс расстояние между меткой и кнопками.

Я также попытался добавить обработчик событий программно с:

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?") Из каждого объявления и вуаля! Код теперь работает как задумано!

Другие вопросы по тегам