В своем приложении я хочу выполнить переход на основе UITapGestureRecognizer. Если касание находится в верхней части экрана, необходимо выполнить переход к SettingsView.
В UIKit это было довольно просто. Я активировал PerformSegue в UITapGestureRecognizer, заключив его в оператор if.
Теперь я хотел бы написать SettingsView() в SwiftUI. SettingsView() будет встроен в UIHostingController.
Мой вопрос: Как я могу выполнить переход к этому UIHostingController (при этом сообщая UIHostingController, какое представление отображать)?
Я попытался использовать новый @IBSegueAction. Причина использования этого @IBSegueAction заключается в том, что я могу использовать его, чтобы сообщить UIHostingController, какое представление отображать. Проблема в том, что я не могу сейчас вставить условие. Везде, где есть тап на экране, выполняется переход. Я не нашел способ отменить переход в @IBSegueAction.
Мой код в настоящее время выглядит так:
@IBSegueAction func showSettingsHostingControler(_ coder: NSCoder, sender: UITapGestureRecognizer, segueIdentifier: String?) -> UIViewController? {
let location = sender.location(in: self.tableView)
if let _ = self.tableView.indexPathForRow(at: location) {
return nil
} else {
if location.y < 32 {
if location.x < view.bounds.midX {
direction = .left
} else {
direction = .right
}
return UIHostingController(coder: coder, rootView: SettingsView())
}
}
return nil
}
В настоящее время результатом является то, что приложение переходит к несуществующему Nil-представлению, когда касание находится не в той области.





based on a UITapGestureRecognizer. In case the tap is in the top area of the screen
Мне кажется, что ваш распознаватель жестов касания привязан к неправильному представлению. Здесь не должно быть никаких решений. Расположите представление в верхней части экрана и прикрепите к нему распознаватель жестов касания. Таким образом, если это представление получает касание, решения принимать не нужно: касание находится в нужном месте.
Он прикреплен к UITableView. Но я хочу обрабатывать нажатие на заголовок таблицы только так
Затем, как я только что сказал, к заголовку таблицы следует прикрепить распознаватель тап-жестов.
Теперь я нашел способ решить это программно: `пусть viewController = UIHostingController(rootView: SettingsView()) self.present(viewController, анимированный: true, завершение: nil)`
Но это всего лишь обычная презентация. Вы спросили, как это сделать изнутри IBSegueAction. Так вот на что я ответил.
Да, это правильно. В идеале я хотел бы выполнить такой переход программно. Мое промежуточное решение каким-то образом работает, но это не то, на что я надеялся.
Ну попробуйте мой ответ. Он говорит вам, как вызвать переход, только когда кран находится в нужном месте.
Альтернативой может быть программная подготовка UIHostingController. Но у меня и так не получилось.