Swift 3 numberOfRows表视图函数错误

时间:2017-04-06 11:46:55

标签: ios swift xcode tableview

我目前遇到的问题是尝试将值用作表视图的numberOfRows函数的返回值。在我的viewDidLoad我有下面的代码,它打印我需要的值,但是当我尝试返回相同的变量时,它表示在展开值时找到了nil。有什么建议吗?

let prevOrderRef = ref?.child("Users").child(currentUserID!).child("Previous Orders")

    prevOrderRef?.observeSingleEvent(of: .value, with: { (snapshot) in

        let dict = PreviousOrders(snapshot: snapshot)
        self.prevOrderCount = dict.prevOrdersDict?.count
        print(self.prevOrderCount!)

    })

更新:

func tableView(_ tableView: UITableView, numberOfRowsInSection section:            Int) -> Int {
    if tableView == self.currentOrderTblView {

        return 1
    } else {

        let prevOrderRef = ref?.child("Users").child(currentUserID!).child("Previous Orders")

        prevOrderRef?.observeSingleEvent(of: .value, with: { (snapshot) in


            let dict = PreviousOrders(snapshot: snapshot)
            self.prevOrderCount = dict.prevOrdersDict?.count
            print(self.prevOrderCount!)



        })

        return 2
    }


}

我已经在numberOfRows中移动了firebase数据库数据。 这会打印所需的值,但我仍然无法将其用作返回值。

2 个答案:

答案 0 :(得分:1)

我认为问题在于您正在尝试访问最有可能是异步调用的远程数据库,因此您只是在numberOfRowsInsection被点击时没有值。

修改

最简单的方法是将didSet用于self.prevOrderDict。这样,您就可以确切地知道何时将值分配给Dict。

最初,您可以检查是否self.prevOrderDict != nil,如果是,则使用count作为返回值,否则返回0.这将为您提供一个空表。点击didSet后,您可以使用tableView.reloadData()

var prevOrderDict = [] {
     didSet {
     tableView.reloadData()
 }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     if self.prevOrderDict != nil {
          return self.prevOrderDict.count 
     } else {
          return 0 
     }

答案 1 :(得分:0)

删除!来自退货声明

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
  if tableView == self.currentOrderTblView 
  { 
   return 1 
  } 
  else
  { 
   return self.prevOrderCount
  }
}

将变量声明为

 var prevOrderCount: Int!

同样在viewDidLoad中将其初始化为

  self.prevOrderCount=0 // 0 or anything you wanted as default 

假设这些选项包含一个值。因此,无论何时访问它都将隐式解包可选,它将自动为您强行打开。如果它不包含值,它将崩溃。

确保您已分配值