используйте popToRootViewController и передайте данные

Я подаю заявку на должность младшего разработчика, и у меня есть очень конкретная задача, на выполнение которой у меня уже ушло 3 дня. Звучит просто - передавайте данные в rootViewController. Вот что я сделал:

1)

   private func userDefaultsToRootController() {
        let input = textField.text!
        defaults.set(input, forKey: "SavedLabel")
        navigationController?.popViewController(animated: true)
    } 
  1. частная функция segueToRootViewController () {let destinationVC = MainScreen1 () let input = textField.text!

      if input == "" { self.navigationController?.popToRootViewController(animated: true) }
    
      destinationVC.input = input
      navigationController?.pushViewController(destinationVC, animated: true)
    

    }

private func popToNavigationController() {
    let input = textField.text!
    if let rootVC = navigationController?.viewControllers.first as? MainScreen1 {
        rootVC.input = input
    }
    navigationController?.popToRootViewController(animated: true)
}
  1. I've used CoreData

Но вот трудная часть - у меня есть электронное письмо, что все эти методы недостаточно хороши, и мне нужно использовать делегат и закрытие. Раньше я выполнял делегирование и закрытие, но когда я метод делегата popToRootViewController передает nil. Не могли бы вы хотя бы указать, где найти информацию об этом?

** ДОБАВЛЕН **

Есть 2 контроллера просмотра: начальный и второй. Вот что у меня есть в контроллере начального представления:

var secondVC = MainScreen2()

override func viewDidLoad() {
        super.viewDidLoad()     
        secondVC.delegate = self
    }

Вот как я нажимаю SecondViewController

@objc private func buttonTapped(_ sender: CustomButton) {
        
        let nextViewController = MainScreen2()
        navigationController?.pushViewController(nextViewController, animated: true)
                
    }

В SecondViewController у меня есть этот протокол

protocol PassData {
    func transferData(text: String)
}

Также делегат:

var delegate: PassData?

Вот как я возвращаюсь к исходному контроллеру представления

@objc private func buttonTapped(_ sender: CustomButton) {
        
        if let input = textField.text {
            print(input)
            self.delegate?.transferData(text: input)
            self.navigationController?.popToRootViewController(animated: true)
        }
        
    }

Вернемся к контроллеру начального представления, где я реализовал метод делегата

extension MainScreen1: PassData {
    func transferData(text: String) {
        print("delegate called")
        label.text = text
        
    }
}

Делегату не звонят.


person Roma Kavinskyi    schedule 23.06.2020    source источник
comment
Вы добавили точку останова, чтобы проверить, вызывается ли ваш метод делегата в исходном контроллере представления? Вы установили делегата как self в исходном контроллере представления?   -  person Mat    schedule 23.06.2020
comment
Я установил делегата на себя в исходном контроллере представления, но он не вызывается   -  person Roma Kavinskyi    schedule 23.06.2020
comment
это неправильное место, где вы поставили делегата. Вы должны установить его в своей buttonTapped функции, а не в viewDidLoad. Это не тот экземпляр, который вы вставляете в стек   -  person Mat    schedule 23.06.2020


Ответы (1)


НА ОСНОВЕ ВАШЕГО РЕДАКТИРОВАНИЯ:

Вы должны установить делегата в buttonTapped

@objc private func buttonTapped(_ sender: CustomButton) {
    
    let nextViewController = MainScreen2()
    nextViewController.delegate = self // HERE WHERE YOU SET THE DELEGATE
    navigationController?.pushViewController(nextViewController, animated: true)
            
}

Вы можете удалить второй экземпляр и свой код в viewDidLoad. Это не тот случай, когда вы настаиваете.

Это должно указать вам правильное направление использования обработчика делегирования и завершения.

protocol YourDelegateName {
   func passData(data:YourDataType)
}

class SecondViewController: UIViewController {

  var delegate: YourDelegateName?

  func passDataFromSecondViewController(){

     YourCoreDataClass.shared.getCoreData { (yourStringsArray) in
     self.delegate?.passData(data: yourStringsArray)
     self.navigationController?.popToRootViewController(animated: true)
     }
  }

class InitialViewController: UIViewController, YourDelegateName {


   override func viewDidLoad() {
      super.viewDidLoad()
      // or whenever you instantiate your SecondViewController
      let secondViewController = SecondViewController()
      secondViewController.delegate = self //VERY IMPORTANT, MANY MISS THIS 
      self.navigationController?.pushViewController(createVC, animated: true)
    }


   func passData(data:YourDataType){
       //user your data
   }

}


class YourCoreDataClass: NSObject {
    
     static let  shared = YourCoreDataClass()

     func getCoreData (completion: ([String]) -> ()){
        ........... your code 
         let yourStringsArray = [String]() // let's use as example an array of strings
         //when you got the data your want to pass
         completion(yourStringsArray)
      }
}
person Mat    schedule 23.06.2020
comment
Спасибо за Ваш ответ! К сожалению, почему-то не вызывают делегата. Моя реализация в точности такая же, как у вас. - person Roma Kavinskyi; 23.06.2020
comment
вы уверены, что используете тот же экземпляр, который запускается контроллером навигации? Вы можете разместить свой код? - person Mat; 23.06.2020
comment
Есть только 2 ViewController. Начальный и второй. Пока я использую второй контроллер представления, я использую метод `navigationController? .PopToRootViewController (animated: true)`. Я считаю, что это тот же самый случай. - person Roma Kavinskyi; 23.06.2020
comment
Я имею в виду, когда вы нажимаете свой второй контроллер представления? Можете ли вы показать часть, в которой вы устанавливаете делегата на себя, и нажимаете его в Initial? - person Mat; 23.06.2020
comment
Я добавил это в исходный пост - person Roma Kavinskyi; 23.06.2020
comment
Я рад, что это сработало. Не могли бы вы принять ответ. ;) - person Mat; 23.06.2020