IOS Swift调用来自不同类的函数获得nil

时间:2017-10-14 18:03:52

标签: swift uitableview swift3

我使用的是swift 3,我有一个从数据库中获取数据的TableView。当TableView到达第3行时,我从数据库中获取更多数据。一切正常但是我有大约3个不同的TableView可以使用该功能,所以我隔离逻辑并将其放入它自己的功能,所以我可以调用它为其他3个Tableview。这是我的代码正常工作

class HomeC: UIViewController,UITableViewDataSource,UITableViewDelegate {

    var streamsModel = streamModel()
    var timeLineModel = TimeLineModel()

      func reloadTable() {
      // This gets data from the database 
        timeLine.Stream(streamsModel: streamsModel, TableSource: TableSource, Controller: self, post_preview: post_preview, model: timeLineModel)

    }
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        if timeLineModel.Counter <= streamsModel.Locations.count {
            if indexPath.row == self.streamsModel.Locations.count - 3  {
                // I now get 20 more rows from the database
                timeLineModel.Page += 1
                reloadTable()
                timeLineModel.Counter += 20
            }
        } 
    }

 }

上面的代码正常工作但是我必须在其他3个TableView中使用相同的逻辑,我想将该逻辑转换为1个函数,然后调用它。这是我的新代码

class TimeLine: NSObject {

        func GetMoreData(streamsModel: streamModel, timeLineModel: TimeLineModel, indexPath: IndexPath) {


            if timeLineModel.Counter <= streamsModel.Locations.count {
                if indexPath.row == streamsModel.Locations.count - 3  {

                    timeLineModel.Page += 1
                   // I Get a nil error here
                    HomeC().reloadTable()
                    timeLineModel.Counter += 20
                }
            }
        }
      }

    then I call it here

     class HomeC: UIViewController,UITableViewDataSource,UITableViewDelegate {
 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        timeLine.GetMoreData(streamsModel: streamsModel, timeLineModel: timeLineModel, indexPath: indexPath)

    }
}

我在 HomeC()。reloadTable()上得到了nil错误,这是可以理解的,无论如何我可以解决这个问题吗?只有当我尝试获取更多数据时才会出现错误,因为新函数无法看到reloadTable函数及其内部的所有内容已在HomeC类/控制器中初始化

1 个答案:

答案 0 :(得分:2)

看起来糟糕的设计。当您从另一个对象直接调用<div class="example"> <h1> Div 1 </h1> </div> <div class="div2"> <div class="div3"> <h1> Div 3 </h1> <p> Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text </p> </div> </div> <div class="example"> <h1> Div 4 </h1> </div>时,会增加代码的复杂性。其他对象不应该知道控制器的内部实现。您可以将reloadTable()块添加到complete(方法名称以小写字母开头)签名。此块将调用而不是getMoreData

HomeC().reloadTable()

使用:

func getMoreData(streamsModel: streamModel, 
                               timeLineModel: TimeLineModel, 
                               indexPath: IndexPath, 
                               complete: @escaping  () -> Void) {
            if timeLineModel.Counter <= streamsModel.Locations.count {
                if indexPath.row == streamsModel.Locations.count - 3  {
                    timeLineModel.Page += 1
                    timeLineModel.Counter += 20
                    complete()
                }
            }
        }
 }