Блокировка прокрутки во время обновления? - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю над приложением и хочу, чтобы мое окно прокрутки блокировалось на месте во время загрузки данных. В настоящее время, когда пользователь обновляет представление прокрутки, он сразу же возвращается на место. Как я могу настроить свой код так, чтобы представление прокрутки блокировалось до тех пор, пока код внутри него не будет полностью выполнен? Вот мой код:

@IBOutlet weak var scrollView: UIScrollView!
var refreshControl: UIRefreshControl!

@objc func refreshData(sender: UIRefreshControl){
    getItems()

    sender.endRefreshing()
}

вот моя функция getItems ():

   func getItems() {
    //Hit the web service Url
    let serviceUrl = "omitted"
    let url = URL(string: serviceUrl)
    //Download the json data
    if let url = url{
        //Create a URL Session
        let session = URLSession(configuration: .default)
        let request = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 15.0)
        let task = session.dataTask(with: request, completionHandler: {(data, response, error) in
            if error == nil {
                //Succeeded
                //Call the parse json function on the data
                self.parseJson(data!)
            }
            else {
                print("error occured in getItems")
            }
        })
        // Start the task
        task.resume()
    }
}
//Parse it out into DataModel structs

func parseJson(_ data:Data){
    //parse the data into DataModel structs
    do{
        //parse the data into a json object
        let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as! [Any]
        //loop through each result in the json array
        for jsonResult in jsonArray {
            //Cast json result as a dictionary
            let jsonDict = jsonResult as! [String:String]
            //create new bar data and set its properties
            let bardata = DataModel(name: jsonDict["Bar Name"]!, cover: jsonDict["Bar Cover"]!, deals: jsonDict["Drink Deals"]!)
            //add it to the array
            bar_info.append(bardata)
        }
    }
    catch{
        print("There was an error")
    }
    //call function here
    update_cover()

}

func update_cover(){
    var a_cover = "$5"
    var b_cover = "$5"
    var c_cover = "$5"
    var d_cover = "$5"

    for item in bar_info{
        if item.name == "omitted"{
            a = item.cover
        }

        else if item.name == "omitted"{
            b_cover = item.cover
        }

        else if item.name == "omitted"{
            c_cover = item.cover
        }

        else if item.name == "omitted"{
            d_cover = item.cover
        }
    }


    DispatchQueue.main.async {
        self.aCoverView.text = a_cover
        self.bCoverView.text = b_cover
        self.cCoverView.text = c_cover
       self.dCoverView.text = d_cover
    }

}

Ответы [ 4 ]

0 голосов
/ 02 ноября 2018

Вы можете сделать что-то подобное в getItems:

    func getItems() {
        //Hit the web service Url
        let serviceUrl = "omitted"
        let url = URL(string: serviceUrl)
        //Download the json data
        if let url = url{
            //Create a URL Session
            let session = URLSession(configuration: .default)
            let request = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 15.0)
            let task = session.dataTask(with: request, completionHandler: {(data, response, error) in
                DispatchQueue.main.async {
                    self.refreshControl.endRefreshing()
                }
                if error == nil {
                    //Succeeded
                    //Call the parse json function on the data
                    self.parseJson(data!)
                }
                else {
                    print("error occured in getItems")
                }
            })
            // Start the task
            task.resume()
        }
    }

Контроль обновления должен завершиться обновлением только после завершения сетевого запроса (т. Е. В обработчике завершения). Поскольку запрос является асинхронным, getItems возвращается немедленно, пока запрос еще выполняется.

0 голосов
/ 01 ноября 2018

Непосредственно перед перекодировкой просмотра прокрутки сохраните смещение содержимого текущей позиции, а затем установите его, когда перезагрузка будет завершена.

var currentPos:CGPoint?

func reloadScrollview() { 
    currentPos = scrollview.contentOffset

    // do your reloading stuff
    // layout your subviews inside the scrollview
    // set the content size based upon your subviews

    scrollview.contentOffset = currentPos

}

Удачного кодирования.

0 голосов
/ 01 ноября 2018

Похоже, вы реализуете функцию «pull-to-refresh», поэтому я предполагаю, что вы захотите использовать метод делегата scrollViewDidScroll:

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    let offset = scrollView.contentOffset // get the current offset
    scrollView.isUserInteractionEnabled = false // disable interaction
    scrollView.setContentOffset(offset, animated: false) // freeze the offset

}

Теперь вам просто нужно настроить метод.

0 голосов
/ 01 ноября 2018

для блокировки просмотра прокрутки используйте scrollView.isUserInteractionEnabled = false , а затем разблокируйте scrollView.isUserInteractionEnabled = true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...