如何在 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)中将字符串格式的日期转换为另一种字符串格式[重复]