Как перейти к другому контроллеру представления при нажатии кнопки в swift 3

#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:

  1. Это должно быть OverlayViewDelegate не OverlayViewControllerDelegate , поскольку это не контроллер, с которого вы отправляете событие, верно? С OverlayView точки зрения не имеет значения, кто на самом деле реализует этот протокол, но более важно, кто отправляет событие.

  2. Вероятно, у вас где-то есть контроллер представления, который использует implement этот протокол:

 class ViewController: UIViewController, OverlayViewDelegate {
    //another code
    func didCancel(overlayView: OverlayView) {
         //show a new controller
    }
}
  
  1. Отображение нового контроллера программно.
    Вы можете либо представить его модально, либо поместить в стек навигации. Первый подход предпочтительнее, если вы собираетесь показывать только один контроллер и нет более глубоких контроллеров просмотра для отображения, а второй предназначен для добавления все большего количества контроллеров в стек навигации.

Нажмите на навигационный стек:

 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)
  
  1. Показ нового контроллера с использованием переходов.
    Вы можете создать переход в раскадровке от одного контроллера представления к другому путем перетаскивания с нажатой правой кнопкой мыши. Если вы назначите идентификатор раскадровки, вы сможете затем perform перейти к следующему коду:

 performSegue(withIdentifier: "segueIdentifier", sender: nil)
performSegue(withIdentifier: "segueIdentifier", sender: someUsefulData)
  

Сам переход может выдвигаться или присутствовать модально, просто выберите правильный тип при его создании.

  1. Скорее всего, это ваш случай. Если у вас уже есть представленный контроллер представления и вы хотите вернуться назад, используйте dismiss(анимированный: завершение:) при обработке обратного вызова:

 func didCancel(overlayView: OverlayView) {
    dismiss(animated: true, completion: nil)
}
  
  1. Если у вас уже есть контроллер просмотра, помещенный в стек навигации, вы можете вернуться назад с помощью 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. ответ выше.