#ios #swift #function #button #swift3
#iOS #swift #функция #кнопка #swift3
Вопрос:
Этот код находится в OverlayView.swift
protocol OverlayViewControllerDelegate {
func didCancel(overlayView: OverlayView)
func didShoot(overlayView: OverlayView)
}
class OverlayView: UIView {
@IBOutlet weak var cameraLabel: UILabel!
var delegate: OverlayViewControllerDelegate! = nil
@IBAction func cancel(_ sender: AnyObject) {
cameraLabel.text = "I want to exit"
delegate.didCancel(overlayView: self)
}
Все, что я хочу делать, это каждый раз, когда нажимается кнопка отмены. Заставить текущую страницу преобразовать страницу контроллера просмотра. Я хочу перейти со страницы a на страницу b.
Комментарии:
1. что такое
page a
иpage b
?
Ответ №1:
-
Это должно быть
OverlayViewDelegate
неOverlayViewControllerDelegate
, поскольку это не контроллер, с которого вы отправляете событие, верно? СOverlayView
точки зрения не имеет значения, кто на самом деле реализует этот протокол, но более важно, кто отправляет событие. -
Вероятно, у вас где-то есть контроллер представления, который использует
implement
этот протокол:
class ViewController: UIViewController, OverlayViewDelegate {
//another code
func didCancel(overlayView: OverlayView) {
//show a new controller
}
}
- Отображение нового контроллера программно.
Вы можете либо представить его модально, либо поместить в стек навигации. Первый подход предпочтительнее, если вы собираетесь показывать только один контроллер и нет более глубоких контроллеров просмотра для отображения, а второй предназначен для добавления все большего количества контроллеров в стек навигации.
Нажмите на навигационный стек:
let newViewController = AnotherViewController()
self.navigationController?.pushViewController(vc, animated: true) //your current vc should be already in a UINavigationController
Представить модальный пример:
let newViewController = AnotherViewController()
self.present(newViewController, animated: true, completion: nil)
- Показ нового контроллера с использованием переходов.
Вы можете создать переход в раскадровке от одного контроллера представления к другому путем перетаскивания с нажатой правой кнопкой мыши. Если вы назначите идентификатор раскадровки, вы сможете затемperform
перейти к следующему коду:
performSegue(withIdentifier: "segueIdentifier", sender: nil)
performSegue(withIdentifier: "segueIdentifier", sender: someUsefulData)
Сам переход может выдвигаться или присутствовать модально, просто выберите правильный тип при его создании.
- Скорее всего, это ваш случай. Если у вас уже есть представленный контроллер представления и вы хотите вернуться назад, используйте dismiss(анимированный: завершение:) при обработке обратного вызова:
func didCancel(overlayView: OverlayView) {
dismiss(animated: true, completion: nil)
}
- Если у вас уже есть контроллер просмотра, помещенный в стек навигации, вы можете вернуться назад с помощью popViewController (анимированный:):
func didCancel(overlayView: OverlayView) {
navigationController?.popViewController(animated: true)
}
Комментарии:
1. Этот код является частью приложения, в котором есть ручка для съемки фотографий. Когда фотография сделана по какой-либо причине, отмена не переносит пользователя к контроллеру просмотра, а показывает только полноэкранное изображение фотографии, которую вы только что сделали. Я хочу, чтобы кнопка отмены вернула меня к контроллеру просмотра, независимо от того, сделали вы снимок или нет. Я не думаю, что исходный код может сильно измениться, потому что код все еще должен делать снимок. Это видеосвязь, объясняющая мою проблему. youtube.com/watch?v=rIMmngzuUxY
2. @JCSAM Проверьте обновление. Я думаю, вам просто нужно
dismiss
свойoverlay view controller
(стр.5)
Ответ №2:
Добавьте эти расширения в свой проект, и вы сможете получить контроллер представления с помощью parentViewController
.
//
// UIResponder NextType.swift
//
// Created by Callam Poynter on 02/08/2016.
//
extension UIView {
var parentViewController: UIViewController? {
return next(UIViewController.self)
}
}
extension UIResponder {
func next<T: UIResponder>(_ type: T.Type) -> T? {
switch next {
case let responder as T:
return responder
case let .some(responder):
return responder.next(type)
default:
return nil
}
}
}
Если у вас в раскадровке подготовлен переход с идентификатором:
parentViewController?.performSegueWithIdentifier("fromPageAToB", sender: nil)
Или, если вы создаете экземпляр контроллера вручную, вы можете представить контроллер с помощью:
parentViewController?.presentViewController(pageBController, animated: true, completion: nil)
Если вы предпочитаете не использовать эти расширения и вместо этого просто используете свой протокол делегирования, убедитесь, что контроллер, который представляет OverlayView
соответствует OverlayViewDelegate
, и вы установили делегирование OverlayView
представления на self
в вашем контроллере.
Комментарии:
1. Заменит ли этот код весь код, который я написал ранее? Я не понимаю, где находится кнопка shoot, а где cancel.
2. ответ выше.