Как исправить задержку данных на этапе подготовки? - PullRequest
0 голосов
/ 28 мая 2019

Мои данные задерживались 1 раз, когда я хочу передать данные в моем табличном представлении и передать их другому контроллеру представления

Я использую подготовиться к segue.

сейчас, чтобы получить нужные данные, вернитесь к представлению таблицы и нажмите ту же строку

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toRequestCorrection"{
            let destinationVC = segue.destination as! RequestCorrectionViewController
            if let indexPath = tableView.indexPathForSelectedRow{
                destinationVC.Shift = self.correction["Shift"].stringValue
                destinationVC.LogDate = self.correction["LogDate"].stringValue
                destinationVC.logIn = self.correction["ActualLogIn"].stringValue
                destinationVC.logOut = self.correction["ActualLogOut"].stringValue
                destinationVC.breakEnd = self.correction["ActualBreakEnd"].stringValue
                destinationVC.breakStart = self.correction["ActualBreakStart"].stringValue
                destinationVC.overTimeIn = self.correction["ActualOverTimeIn"].stringValue
                destinationVC.overTimeOut = self.correction["ActualOverTimeOut"].stringValue
                destinationVC.transactionStatusID = self.correction["TransactionStatusID"].intValue
            }
        }
    }

это должно передать данные в строку сразу после того, как я нажал на строку

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Кроме того, вам не нужно использовать segue, вы можете создать экземпляр контроллера представления внутри метода didSelectRowAt с помощью следующего кода без prepareForSegue.

РЕДАКТИРОВАТЬ: Вы не указали, что это асинхронная задача. Итак, я использую Alamofire с обработчиком завершения. Я думаю, что это будет полезно для вас.

typealias yourCompletionHandler = (Data?, _ message: String?, _ errorStatusCode: Int?) -> Void
func yourAsyncTask(handler: @escaping yourCompletionHandler) {
    let parameters: [String: Any] = ["unitId": 4124]
    let url = ""
    Alamofire.request(url, method: .get, parameters: parameters)
        .responseObject { (response: DataResponse<BaseListResponseParser<YourModel>>) in
            switch response.result {
            case .success:
                if let result = response.result.value {
                  handler(result.listItems, nil, nil)
                }
            case .failure(let error):
                print(error)
            }
    }
} 


yourAsyncTask { [weak self] (yourModel, error, _) in
        DispatchQueue.main.async {
            guard let destination = UIStoryboard(name: "Main", bundle: nil)
                .instantiateViewController(withIdentifier: "ViewControllerId") as? RequestCorrectionViewController else { return }
            destination.Shift = yourModel.shift
            navigationController?.pushViewController(destination, animated: true)
        }
    }

При использовании этого способа вам не нужно создавать метод segue или prepareForSegue.

0 голосов
/ 28 мая 2019

Вы должны реализовать tableVew(_:willSelectRowAt:) метод UITableViewDelegate в вашем viewController и установить для свойства коррекции значение выбранной строки.

class YourSourceViewController: UITableViewDelegate{
    var correction: Correction!

    func tableView(_ tabelView: UITableView, willSelecRowAt indexPath: IndexPath) -> IndexPath?{
        correction = correctionList[indexPath.row]
        return indexPath
    }

    func prepare(for segue: UIStoryBoardSegue, sender: Any?){
        //passing data to RequestCorrectionViewController.
        //And also you don't need to check if indexPath is nil.
        //Because this block will called only any row of tableView is selected.
    }
}

Также обратите внимание, что вы можете сделать то же самое в методе tableView(_:didSelectRowAt:), но этот метод работает после выполнения сегментов и вызывает проблему, с которой вы тоже столкнулись.

Редактировать

Если вы считаете, что использование метода willSelectRowAt: является неправильным использованием, вы можете установить в качестве источника вашей программы viewController (вместо ячейки шаблона) и установить идентификатор в Storyboard и вызвать его программно. как сказал @ vadian

func tableView(_ tabelView: UITableView, didSelecRowAt indexPath: IndexPath){
        correction = correctionList[indexPath.row]
        performSegue(withIdentifier "mySegueIdentifier", sender: self)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...