Как отозвать массив данных в другой viewController в iOS Swift - PullRequest
2 голосов
/ 01 марта 2020

В createCardV C я использовал библиотеку carbonKit для отображения панели вкладок. Изначально массив данных загружался с использованием данных stati c, но сейчас я пытаюсь использовать массив данных из webView javascript postMessage.

  1. Когда загружено createCardV C, будет загружен carbonKit первой вкладки webViewV C.
  2. В webView, из postMessage будут перечислены номера пунктов меню для отображения Меню панели вкладок.
  3. Здесь значения вкладок являются динамическими c и возвращаются из webView postMessage.

Вот четкое изображение:

enter image description here

Вот код createCardV C:

  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

}

Вот код для веб-просмотра:

 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)

              }
            }



    }
   }

Мой вопрос:

  1. Как вернуть значения вкладок из webView в CreateCardV C?
  2. Как показать динамические c вкладки в carbonKit?
  3. Как динамически изменить ViewController для следующей вкладки с использованием того же webViewController и URL вернется из webViewController.

Любая помощь высоко ценится pls ...

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Вы можете попробовать использовать " GLViewPagerController ", это более динамично c и API похож на "UITableView"

Вот ссылка: GLViewPagerController

Другие опции:

1 голос
/ 24 марта 2020

Ваш подход не подходит для использования CarbonKit. Вы должны предоставить список вкладок для CarbonKit при его инициализации.

То, что вы пытаетесь достичь, - это инициализировать CarbonKit только одной вкладкой, а затем добавлять дополнительные вкладки по мере необходимости, что не поддерживается CarbonKit.

Что вам нужно сделать, это получить список вкладок перед созданием CarbonTabSwipeNavigation. Если у вас нет другого выбора, кроме использования WebView для получения списка вкладок, сначала загрузите WebView и получите список вкладок, а затем создайте CarbonTabSwipeNavigation.

0 голосов
/ 30 марта 2020

Я настоятельно рекомендую использовать Parchemnt. Он использует Hashable.

https://github.com/rechsteiner/Parchment

См. Бесконечный метод источника данных для использования Dynami c. Загрузите демонстрационный проект и Пример оформления календаря.

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

...