swift4: невозможно передать значение в предыдущий контроллер представления из текущего поповера - PullRequest
0 голосов
/ 06 июня 2018

Я использую swift4, я представляю контроллер вида модально как поповер и хочу передать данные обратно в предыдущий контроллер вида при отклонении текущего поповера, это первый контроллер вида:

import UIKit

class SearchResultViewController: UIViewController, UIPopoverPresentationControllerDelegate, PopoupDelegate {

   @IBOutlet var errorLable: UILabel!
   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "pop") {
        let dest = segue.destination
           if let pop = dest.popoverPresentationController {
               dest.preferredContentSize = CGSize(width: self.view.frame.size.height - 20, height: 500)
               pop.delegate = self
           }
        }
    }

   func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
       return .none
   }

   func popupValueSelected(value: String) {
        print("value: ", value)
        self.errorLable.text = value
   }
}

иэто код поповера:

import UIKit

class SearchPopoverViewController: UIViewController {

   @IBOutlet var cityLable: UILabel!
   var delegate: PopoupDelegate?

   @IBAction func closeButtonAction(_ sender: Any) {
       self.delegate?.popupValueSelected(value: "hiiiiii from the other side")
       self.dismiss(animated: false, completion: nil)
   }
}

и это PopoupDelegate

import Foundation

protocol PopoupDelegate {
   func popupValueSelected(value: String)
}

, когда я нажимаю на кнопку закрытия поповера, поповер должен отклониться, а errorLable в SearchResultViewController должен изменить его текст на новый переданный текст, но ничего не происходит, только всплывающее окно отклонить, что мне делать?

Ответы [ 6 ]

0 голосов
/ 01 января 2019

вы можете использовать "Размотать segue".Пожалуйста, обратитесь

https://medium.com/@mimicatcodes/create-unwind-segues-in-swift-3-8793f7d23c6f
0 голосов
/ 11 июня 2018

Я использовал делегат popover dismiss вместо протокола: этот код решил мою проблему:

в SearchResultViewController:

func popoverPresentationControllerDidDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) {
    if let searchPopoverViewController =
        popoverPresentationController.presentedViewController as? SearchPopoverViewController{
            self.passed_city_id = searchPopoverViewController.selected_city_id
    }
}

в SearchPopoverViewController

@IBAction func searchButtonAction(_ sender: Any) {

    self.selected_city_id = 10

    popoverPresentationController?.delegate?.popoverPresentationControllerDidDismissPopover?(popoverPresentationController!)
    self.dismiss(animated: true, completion: nil)
}
0 голосов
/ 08 июня 2018

Я думаю, у вас есть фундаментальное недопонимание относительно того, как сегменты и протоколы работают для контроллеров представления.Честно говоря, я бы рекомендовал рассмотреть эту тему в Разработка приложений Apple с помощью Swift .Это ясно написано с упражнениями, которые помогут вам понять основы передачи информации между контроллерами представления.Я был там, где вы есть, и хотя предложения и комментарии были правильными, у вас, похоже, нет оснований понимать, что они говорят.Удачи!

0 голосов
/ 06 июня 2018

Когда вы представляете SearchPopoverViewController из SearchResultViewController, вам необходимо установить делегата.

Использование segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  if (segue.identifier == "segueToPopOver") {

       let dest = segue.destination
       if let vc = dest.popoverPresentationController as? SearchPopoverViewController {

           //set other properties

           vc.delegate = self
       }
    }
}

Использование UINavigationController

let vc = SearchPopoverViewController() // initialise view controller
vc.delegate = self
present(vc, animated: true, completion: nil)

Ответ делегату

@IBAction func closeButtonAction(_ sender: Any) {
   self.delegate?.popupValueSelected(value: "hiiiiii from the other side")
   self.dismiss(animated: false, completion: nil)
}

В SearchResultViewController реализовать метод делегата

func popupValueSelected(value: String) {
    print("value: ", value)
    self.errorLable.text = value
}
0 голосов
/ 06 июня 2018

Вы должны определить делегата для SearchResultViewController.

var PopoupDelegate : PopoupDelegate?

и перед pop viewcontroller назначить делегата для popoupDelegate

PopoupDelegate.delegate = self

, и у вас есть правая функция внутри функции.сначала сделай это правильно.Попробуй это.Надеюсь, это сработает.и дайте мне знать в случае каких-либо проблем

0 голосов
/ 06 июня 2018

Вы делегировали неправильную функцию, функция внутри функции в SearchResultViewController:

func popupValueSelected(value: String) {
   func popupValueSelected(value: String) {
       print("value: ", value)
       self.errorLable.text = value
   }
}

Должно быть:

func popupValueSelected(value: String) {
    print("value: ", value)
    self.errorLable.text = value
}

После редактирования вопроса:

Вы никогда не назначали ни одного экземпляра для переменной делегата.Try to change delegate variable name to popoUpDelegate.

pop.delegate для UIPopoverPresentationControllerDelegate, а не для вашего делегата.Эта функция должна выглядеть следующим образом:

if (segue.identifier == "pop") {
     if let dest = segue.destination.popoverPresentationController as? SearchPopoverViewController {
               dest.preferredContentSize = CGSize(width: self.view.frame.size.height - 20, height: 500)
               dest.popoUpDelegate = self
       }
   }
}

А ваши SearchPopoverViewController выглядят так:

class SearchPopoverViewController: UIViewController {

   @IBOutlet var cityLable: UILabel!
   var popoUpDelegate: PopoupDelegate?

   @IBAction func closeButtonAction(_ sender: Any) {
       self.popoUpDelegate?.popupValueSelected(value: "hiiiiii from the other side")
       self.dismiss(animated: false, completion: nil)
   }
}
...