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

Posted

技术标签:

【中文标题】当我的应用程序通过我的 UITabBar 完成启动时,如何将加载的数据传递给 UITableView?【英文标题】:How can I pass data loaded when my application finished launching thru my UITabBar to a UITableView? 【发布时间】:2019-01-07 20:59:27 【问题描述】:

我是一名新的 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。我已经设法通过在 *** 论坛中进行搜索来解决此问题:

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


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

任何帮助将不胜感激!

【问题讨论】:

您正在代码中构建控制器层次结构,但我怀疑它与通过加载情节提要自动完成的操作重复。我这样想的主要原因是您不会对tabBarIntial 做任何事情,例如将其设为您的根控制器。 (另外,你没有说你的标签栏控制器没有出现。)所以,具体来说,我猜你给数据库的控制器不是你看到的那个实例。 对于像你这里的更复杂的流程,我可以建议你研究App Coordinator 模式吗?我希望我在新的时候就学会了。我已经将您链接到使用 Storyboards 的这种模式的示例,因为我认为在这个阶段很难理解没有 Storyboards 的 UI,但是还有其他使用 xibs 的示例。 @PhillipMills 感谢您的澄清。我将数据库附加到 tabBarIntial 的视图控制器之一。我还能做什么?任何代码尝试将不胜感激! @Miladinho 感谢 App Coordinator 链接。我会检查并回复任何问题。 【参考方案1】:

最简单的答案是返回类似于对您有用的逻辑,但关系稍微复杂一些。例如,我创建了一个应用程序,其中包含一个标签栏控制器、第一个标签中的导航控制器以及嵌入在导航控制器中的 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

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

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

【讨论】:

非常感谢您提供的代码 - 让我看看并还原。我同意你的原则,即解决方案与一开始对我有用的方法很接近。我明天会复习——因为已经很晚了——然后回来。再次感谢! 太好奇了,等不及明天了!我已经查看了代码,此时我在链接到导航控制器的 topViewController 的 TableViewController 中收到以下错误:“在 super.init 调用时未初始化属性‘self.SLBprojectDB’”。我在 TableView 的 init() 中收到此错误消息: required init?(coder aDecoder: NSCoder)super.init(coder: aDecoder) ; navigationItem.leftBarButtonItem = editButtonItem 由于该属性是在创建控制器后提供的,因此您可能需要将其设为可选。如果您保证在使用前会提供,您可以像处理插座一样强制打开它。

以上是关于当我的应用程序通过我的 UITabBar 完成启动时,如何将加载的数据传递给 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

最后一个单元格在底部被我的 UITabBar 切断

使用 UITableView 填充 UITabBar

在 iOS 中导航期间更改 UITabBar

单击按钮时UITabbar消失

UITabBar 选择的选项卡在启动时不会改变色调颜色

在 iOS8 中为 UITabbar 添加阴影