如何在 iOS Swift 中将数据数组回调到另一个 viewController

Posted

技术标签:

【中文标题】如何在 iOS Swift 中将数据数组回调到另一个 viewController【英文标题】:how to callback the array of data to another viewController in iOS Swift 【发布时间】:2020-03-01 10:51:53 【问题描述】:

在 createCardVC 中,我使用 carbonKit 库来显示标签栏。最初,使用静态数据加载的数据数组,但现在我尝试使用来自 webView javascript postMessage 的数据数组。

    加载 createCardVC 时,将加载第一个选项卡为 webViewVC 的 carbonKit。 在 webView 中,从 postMessage 中它将列出数字菜单项以显示标签栏菜单。 此处的选项卡值是动态的,将从 webView postMessage 返回。

这是清晰的图片:

这里是createCardVC的代码:

  override public func viewDidLoad() 
    super.viewDidLoad()

    carbonTabSwipeNavigation = CarbonTabSwipeNavigation(items: ["Basic Details"], delegate: self)
    carbonTabSwipeNavigation.insert(intoRootViewController: self, andTargetView: infoView)
    carbonTabSwipeNavigation.toolbar.barTintColor = UIColor.white
    carbonTabSwipeNavigation.setSelectedColor(UIColor.black)
    carbonTabSwipeNavigation.setIndicatorColor(UIColor(hexString: "#363794")) 

//viewdidload

func onUserAction(data: String)

    print("Data received: \(data)")



func sampleDelegateMethod(arg: Bool,completion: (Bool) -> ())

    completion(arg)

    let singleTon = SingletonClass()
            print(singleTon.sharedInstance.dataText)



@IBAction func backBtn(_ sender: Any) 

   _ = navigationController?.popViewController(animated: true)
    navigationController?.setNavigationBarHidden(false, animated: true)
    tabBarController?.tabBar.isHidden = false






public init() 

         super.init(nibName: "CreateCardViewController", bundle: Bundle(for: CreateCardViewController.self))
     

     required init?(coder aDecoder: NSCoder) 

         fatalError("init(coder:) has not been implemented")

     

public func carbonTabSwipeNavigation(_ carbonTabSwipeNavigation: CarbonTabSwipeNavigation, viewControllerAt index: UInt) -> UIViewController 


    return firstView()

   
func firstView() -> UIViewController 



    let cont = WebViewController()
    self.tabContView?.addChild(cont)
    self.tabContView?.view.addSubview(cont.view)

    cont.didMove(toParent: tabContView)
    let authToken = UserDefaults.standard.string(forKey: "authToken")

    cont.formKey = formKey
    print("cont vl", formKey ?? "")
    cont.processInstanceId = processInstanceId
    cont.authTokenValue = authToken
    cont.fullFormKey = fullFormKey
    cont.taskIdValue = TaskIdValue


    return cont


这是 webView 的代码:

 public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) 

    if message.name == "jsHandler" 
       //  print(message.body)

     else if message.name == "tabForm" 


        print("dynamic tabs value::::",message.body)

        let tabs = message.body
        let jsonString = JSONStringify(value: tabs as AnyObject)

            if let jsonData = jsonString.data(using: .utf8) 
              do 
                let decoder = JSONDecoder()
                let mainObject = try decoder.decode(DynamicTabsModel.self, from: jsonData)

                print("tab model:::", mainObject)

                createCardVC?.onUserAction(data: "The quick brown fox jumps over the lazy dog")
                delegate?.onPizzaReady(type: "Pizza di Mama")
                createCardVC?.sampleDelegateMethod(arg: true, completion:  (success) -> Void in

                    print("Second line of code executed")
                    if success  // this will be equal to whatever value is set in this method call

                        createCardVC?.onUserAction(data: "The quick brown fox jumps over the lazy dog")
                        delegate?.onPizzaReady(type: "Pizza di Mama")

                        let singleTon = SingletonClass()
                        singleTon.sharedInstance.dataText = "store data"

                        print("delegate method ::: true")


                     else 
                         print("delegate method ::: false")
                    
                )

                print("called delegate")

               catch 

                print(error.localizedDescription)

              
            



    
   

我的问题是:

    如何将选项卡值从 webView 返回到 CreateCardVC? 如何在 carbonKit 中显示动态标签? 如何使用相同的 webViewController 为下一个选项卡动态更改 ViewController,并且 url 将从 webViewController 返回。

任何帮助都非常感谢...

【问题讨论】:

【参考方案1】:

您使用 CarbonKit 的方法是错误的。您必须在初始化 CarbonKit 时提供选项卡列表。

您想要实现的是仅使用一个选项卡初始化 CarbonKit,然后根据需要添加更多选项卡,CarbonKit 不支持。

您应该做的是在创建CarbonTabSwipeNavigation 之前获取选项卡列表。如果您除了使用 WebView 获取选项卡列表之外别无选择,请先加载您的 WebView 并获取选项卡列表,然后创建 CarbonTabSwipeNavigation

【讨论】:

感谢您的回答。是否有任何其他第三方支持我的方法。 不知道任何这样的库,但我可以建议的一种解决方法是首先加载 CarbonTabSwipeNavigation,其中只有一个带有 Webview 的选项卡,从那里获取选项卡的数量并发布一个本地通知(选项卡作为 userData)和可以使用新标签重新创建整个 CarbonTabSwipeNavigation【参考方案2】:

您可以尝试使用“GLViewPagerController”,它更动态,API 类似于“UITableView”

这是链接: GLViewPagerController

其他选项:

Parchment PolioPager

【讨论】:

【参考方案3】:

我强烈建议使用 Parchemnt。它使用 Hashable。

https://github.com/rechsteiner/Parchment

查看动态使用的无限数据源方法。下载演示项目并查看日历示例。

https://github.com/rechsteiner/Parchment/blob/master/Documentation/infinite-data-source.md

【讨论】:

以上是关于如何在 iOS Swift 中将数据数组回调到另一个 viewController的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift(ios)中将字符串格式的日期转换为另一种字符串格式[重复]

如何在 iOS Swift 中将选定的 tableView 单元格保存到数组中?

如何在 Qt 中将数据从一种形式传递到另一种形式?

在 iOS 中将推送通知从一台设备发送到另一台设备

如何在同一个表中将数据从一列复制到另一列?

如何在没有 segue 的情况下在 Swift 3 中将数据从 VC 传递到另一个?