在Swift中将闭包传递给addTarget

时间:2017-03-31 05:41:11

标签: ios swift

我有一个从api获取电影然后将数据加载到UITableView的方法。我想重用网络调用进行刷新控制,并在http get请求结束时调用一个完成处理程序,它基本上会在刷新控制成功后停止。这可能吗?

func getMovies(completion: (() -> ())?) {
    SVProgressHUD.show()
    Alamofire.request("https://api.moviesite").responseJSON {
        response in
        switch response.result {
        case .success(let data):
            if let json = data as? NSDictionary {
                self.movieResults = json["results"] as! [NSDictionary]
                self.nowPlayingTableView.reloadData()
            }
        case .failure(let error):
            print(error)
            self.showNetworkError(show: true)
        }

        SVProgressHUD.dismiss()
        if completion != nil {
            completion!()
        }
    }
}

当我在viewDidLoad中使用此方法时,我想做类似的事情:

let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: #selector(NowPlayingViewController.getMovies(refreshControl.endRefreshing)), for: .valueChanged)
        nowPlayingTableView.insertSubview(refreshControl, at: 0)

但是我收到了关于

的编译器错误

getMovies不能使用,你的意思是使用值类型吗?

2 个答案:

答案 0 :(得分:2)

您使用selector设置的唯一UIRefreshControl#selector(refreshing)#selector(refreshing(_:))表示selector,其中UIRefreshControl为参数或没有任何参数。如果您想结束刷新,请尝试这样做。

let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(refreshing(_:)), for: .valueChanged)
nowPlayingTableView.insertSubview(refreshControl, at: 0)

现在为您的控制器添加一个操作refreshing并与其一起调用getMovies,并在完成getMovies时调用end​Refreshing上的UIRefreshControl

func refreshing(_ sender: UIRefreshControl) {
    self.getMovies() {
        sender.end​Refreshing()
    }
}

答案 1 :(得分:0)

将您的refreshControl.addTarget(self, action: #selector(NowPlayingViewController.getMovies(_:)), for: .valueChanged) 代码更改为:

func getMovies(_ sender: UIRefreshControl) {
   ...
   sender.endRefreshing()
}

你的功能

    var myApp = angular.module("myApp", []);

    myApp.controller('studentController', function($scope, $route, $routeParams, $http, $location) {
      //Get all students
      $scope.getStudents = function() {
        $http.get('/api/student/').then(function(response) {
          $scope.students = response.data;
        });
      };
    });