使用协议将appDelegate中的数组传递给Viewcontroller

时间:2019-04-10 06:32:54

标签: arrays swift userdefaults

我需要使用协议将数组从AppDelegate传递到viewcontroller。我是这个概念的新手。请帮我一些代码。我需要将字符串dataArr传递给另一个viewcontroller并将其显示在tableview

guard let message = note(fromRegionIdentifier: region.identifier) else { return }
window?.rootViewController?.showAlert(withTitle: nil, message: "you have entered "  +  message)
if (dataArr.count <= 5){
    dataArr.append(message)
}

let userdefaults = UserDefaults.standard
userdefaults.set(dataArr, forKey: "message")
}

我只需要将这些警报保存到userdefaults并将它们显示在tableview上,我刚刚尝试过,但是它只在tableview上显示了单个字符串

let savedstring = UserDefaults.standard.array(forKey: "message")
cell?.cordinateLabel.text =  savedstring?[indexPath.row] as? String
return cell!

1 个答案:

答案 0 :(得分:1)

  1. 使用协议

首次创建协议

protocol MyDelegate {
     public yourMethod(param: String);
}

在您的ViewController中,您需要从Protocol扩展它,并将其设置为AppDelegate

 class YourViewController: MyDelegate {
     // Your Other methods

     override func viewDidLoad() {
          super.viewDidLoad()

          // set your delegate to Appdelegate
          let appDelegate = UIApplication.shared.delegate as! AppDelegate
          appDelegate.yourDelegate = self;
     }


     func yourMethod(param: String) {
      // Do your stuff
     }
 }

现在,终于在AppDelegate中声明协议对象并通过其引用调用yourMethod。

 class AppDelegate: UIApplicationDelegate {
     public yourDelegate: MyDelegate!;
 }

现在,您可以在AppDelegate中的任意位置调用方法,例如

  yourDelegate.yourMethod(params);
  1. 使用NotificationCenter

最简单的方法是使用NotificationCenter。 首先,您需要在应用程序中的任何位置向Notification.Name添加扩展名。喜欢

extension Notification.Name { static let mynotification = Notification.Name("mynotification") }

在您的视图控制器中的viewDidLoad方法中添加

NotificationCenter.default.addObserver(self, selector: #selector(yourMethod), name: NSNotification.Name.mynotification, object: nil)

然后在您的ViewController中添加一个方法,该方法将在触发通知时被调用

 func yourMethod(){
        //// do something
   }

现在,在您的应用程序委托中,甚至在应用程序中的任何地方,您都可以通过发送通知Like来调用viewController的方法

 NotificationCenter.default.post(name: NSNotification.Name.mynotification, object: nil)