首页 > 解决方案 > 当我的应用程序通过我的 UITabBar 完成启动时,如何将加载的数据传递给 UITableView?

问题描述

我是一名新的 iOS 程序员,我正在尝试制作一个涉及以下流程的应用程序:

-> UITabBar -> UINavController -> UITableViewController.

最初,当我有以下流程时,程序正在运行:

-> UINavController -> UITableViewController

但是当我添加 UITabBar(使用 Embed In 方法)时,我遇到了两个问题:

1) 将初始视图从 UITableView 投射到 UITabBarView 2) 从手机存档恢复的数据没有加载到 TableView 中。

我设法解决了 UIStoryboard ID 的转换问题,但我不确定这种方式是否造成了第二个问题,即没有正确地将数据传递给 UITableView。

投射问题发生在 appDelegate 代码中。这是我在合并 UITabBarView 之前的原始代码:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

let navController = window!.rootViewController as! UINavigationController

let SLBprojectController = navController.topViewController as! GR8TableView

SLBprojectController.SLBprojectDB = thisSLBprojectDB

return true
}

上面代码的问题是它告诉我它不能将 TableViewController (GR8TableView) 转换为 UITabBarView。我已经设法通过在 StackOverflow 论坛中进行搜索来解决此问题,方法是:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

let mainStoryboardIpad : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)

let tabBarIntial : UITabBarController = mainStoryboardIpad.instantiateViewController(withIdentifier: "TabBar") as! UITabBarController

let navigationController:UINavigationController = mainStoryboardIpad.instantiateViewController(withIdentifier: "navController") as! UINavigationController

let navigationController1:UIViewController = mainStoryboardIpad.instantiateViewController(withIdentifier: "ViewController1")

let SLBprojectController = navigationController.topViewController as! GR8TableView

SLBprojectController.SLBprojectDB = thisSLBprojectDB

tabBarIntial.viewControllers = [navigationController, navigationController1]

tabBarIntial.selectedIndex = 0

return true

}

但是在我修复了“casting”问题之后,我在 TableView 中加载数据时遇到了问题。不确定这个问题是否与我修复铸造问题的方式有关。

任何帮助将不胜感激!

标签: iosswiftuinavigationcontrolleruitabbarcontrollerxcode10

解决方案


最简单的答案是回到类似于对你有用的逻辑,但关系稍微复杂一些。例如,我创建了一个带有标签栏控制器、第一个标签FirstViewController中的导航控制器和嵌入导航控制器的应用程序。

由于我没有数据库,因此我提供了FirstViewController一个名为running.

以下代码找到控制器并设置变量:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if let tabController = window!.rootViewController as? UITabBarController {
        if let navController = tabController.viewControllers![0] as? UINavigationController {
            if let firstController = navController.topViewController as? FirstViewController {
                firstController.running = true
            } else {
                print("Unexpected controller in navigation hierarchy: \(String(describing: navController.topViewController))")
            }
        } else {
            print("Unexpected contained controller: \(String(describing: tabController.viewControllers![0]))")
        }
    } else {
        print("Unexpected root controller: \(String(describing: window!.rootViewController))")
    }
    return true
}

请注意,我没有创建任何新的控制器。这一切都是通过默认故事板加载完成的。

我相信您应该能够将其调整为您自己的变量和类名。


推荐阅读