TableViews无法与TabBarController Swift

时间:2019-05-25 12:22:22

标签: ios swift tableview uitabbarcontroller tabbarcontroller

我有一个带有tableView的应用。我决定与其他tableViews添加更多屏幕,因此我以编程方式添加了tabBarController。现在,在这些行上出现一个 found nil错误

    tableView.delegate = self
    tableView.dataSource = self

如果我删除它们,tableView将不会加载。你知道我可能做错了吗?

我在主情节提要板上添加了一个tabBarController,并将其链接到swift文件,但是它也不起作用。

        class SecondVC: UIViewController,UITableViewDelegate, UITableViewDataSource {

        @IBOutlet weak var tableView: UITableView!

        var SoundsClasss = [SoundsClass]()

        override func viewDidLoad() {
        super.viewDidLoad()

         let p1 = SoundsClass(imageURL: "sound 01", audioURL: "01", videoTitle: "1", duration: 100)
         let p2 = SoundsClass(imageURL: "sound 01", audioURL: "02", videoTitle: "2", duration: 100)

         SoundsClasss.append(p1)
         SoundsClasss.append(p2)

         tableView.delegate = self
         tableView.dataSource = self

         }

TabBarController的代码。我是否需要在此处进行任何更改以指定视图为tableView

        class MainTabBarController: UITabBarController {

             override func viewDidLoad() {
              super.viewDidLoad()

                 tabBar.barTintColor = UIColor.white
                 setupTabBar()

                }

             func setupTabBar(){

              let FirstController = UINavigationController(rootViewController: MainVC())
              let SecondController = UINavigationController(rootViewController: SecondVC()) 
              let ThirdController = UINavigationController(rootViewController: ThirdVC())

              viewControllers = [FirstController, SecondController,ThirdController]

              guard let items = tabBar.items else { return }        
              for item in items {
                    item.imageInsets = UIEdgeInsets(top: 4, left: 0, bottom: -4, right: 0)
                   }
                }

             }

3 个答案:

答案 0 :(得分:1)

您正在使用SecondVC()创建控制器。那没有引用情节提要,所以它没有设置任何出口。

您需要在情节提要中构建视图控制器层次结构,并使其默认加载,或者在将情节提要添加到导航控制器之前从情节提要中获取控制器。

请参阅文档:

func instantiateViewController(withIdentifier identifier: String) -> UIViewController

答案 1 :(得分:1)

在名为SecondVC的类中,您有UITableView实例的插座引用,这意味着您在Stroyboard中创建表视图,因此无法使用应使用的初始化程序来创建视图控制器

UIStoryboard(name: "yourStoryBoardName", bundle: nil).instantiateViewController(withIdentifier: "yourViewcontrollerID")

setupTabBar函数应如下所示

 func setupTabBar(){

    let vc1 = UIStoryboard(name: "yourStoryBoardName", bundle: nil).instantiateViewController(withIdentifier: "yourFirstViewcontrollerID")
    let vc2 = UIStoryboard(name: "yourStoryBoardName", bundle: nil).instantiateViewController(withIdentifier: "yourSecondViewcontrollerID")
    let vc3 = UIStoryboard(name: "yourStoryBoardName", bundle: nil).instantiateViewController(withIdentifier: "yourThirdViewcontrollerID")

    let FirstController = UINavigationController(rootViewController: vc1)
    let SecondController = UINavigationController(rootViewController: vc2)
    let ThirdController = UINavigationController(rootViewController: vc3)

    viewControllers = [FirstController, SecondController,ThirdController]

    guard let items = tabBar.items else { return }
    for item in items {
        item.imageInsets = UIEdgeInsets(top: 4, left: 0, bottom: -4, right: 0)
    }
}

答案 2 :(得分:0)

如果您至少有 2 ios 3 天的经验,就好像您是初学者一样,那么您已经知道,如果不添加 UITableView将永远无法加载 UiViewController 中委托数据源

  

如果将其从viewDidLoad()中删除,则您的项目可能无法将UITableView加载到UiViewController