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

Я использую подготовиться к 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
            }
        }
    }

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

0
Klaudius Ivan 28 Май 2019 в 11:34

2 ответа

Лучший ответ

Кроме того, вам не нужно использовать 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
atalayasa 29 Май 2019 в 07:36

Вы должны реализовать 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:), но этот метод работает после выполнения segues и также вызывает проблему, с которой вы столкнулись.

< Сильный > Edit

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

func tableView(_ tabelView: UITableView, didSelecRowAt indexPath: IndexPath){
        correction = correctionList[indexPath.row]
        performSegue(withIdentifier "mySegueIdentifier", sender: self)
    }
0
Ekrem Duvarbasi 29 Май 2019 в 07:22