【问题标题】:use popToRootViewController and pass Data使用 popToRootViewController 并传递数据
【发布时间】:2020-10-13 13:41:59
【问题描述】:

我正在申请初级开发人员职位,我有一个非常具体的任务,我已经花了 3 天时间完成。听起来很简单 - 将数据传递给 rootViewController。 这就是我所做的:

1)

   private func userDefaultsToRootController() {
        let input = textField.text!
        defaults.set(input, forKey: "SavedLabel")
        navigationController?.popViewController(animated: true)
    } 
  1. 私有函数 segueToRootViewController() { 让destinationVC = MainScreen1() 让 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. 我用过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
        
    }
}

没有调用代理。

【问题讨论】:

  • 您是否添加了一个断点来检查您的委托方法是否在您的初始视图控制器中被调用?您是否在初始视图控制器中将委托设置为 self?
  • 我在初始视图控制器中将委托设置为 self,但它没有被调用
  • 设置委托的地方不对。您必须在buttonTapped 函数中设置它,而不是在viewDidLoad 中。那不是您要压入堆栈的实例

标签: ios swift uinavigationcontroller pass-data poptoviewcontroller


【解决方案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)
      }
}

【讨论】:

  • 感谢您的回答!不幸的是,为什么委托没有被调用。我的实现和你的完全一样。
  • 您确定您使用的实例与导航控制器推送的实例相同吗?你能发布你的代码吗?
  • 只有 2 个 ViewController。第一个和第二个。当我在第二个视图控制器上时,我使用方法 `navigationController?.popToRootViewController(animated: true) `。我相信这是同一个例子。
  • 我的意思是当你推动你的第二个视图控制器时?您能否展示您将代理设置为 self 的部分并将其推送到 Initial?
  • 我已将其添加到原帖中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2013-03-27
  • 2020-12-06
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多