realm selectedRowAtIndexPath с использованием segue, показывающим разные результаты - PullRequest
1 голос
/ 23 апреля 2020

Я впервые использую управление сегментами и область. поэтому в настоящее время я использую segue для выполнения перехода к Add / EditV C для изменения данных.

когда segue выполняется и передает данные в Add / EditV C в переменную selectedTransaction, я хочу, чтобы следующие данные были заполнены соответственно

/* selectedTransaction print statement Results */
print("selectedTransaction = \(selectedTransaction!)")

selectedTransaction = Transaction {
    categoryType = Category {
        type = expense;
        name = EXPENSE 3;
    };
    amount = 1000;
    date = April 2;
}

  1. amountTF.text = selectedTransaction .amount (сделано и исправлено)
  2. categorySCoutlet.selectedSegmentIndex = selectedTransaction.categoryType.type (не удается отобразить сегментный индекс в selectedTransaction.categoryType.type)
  3. categoryTF.text = selectedTransaction.categoryType.name (имя отображается правильно, однако вернет ноль, если пользователь снова НЕ ПЕРЕСЕЛИТ)

Я ожидал, что все данные отображаются как если он создан.

Тем не менее, я столкнулся с двумя проблемами при выполнении этого

  1. Выбранный индекс SegmentControl всегда в 0 вместо selectedTransaction.categoryType.name (я хочу контроль сегмента должен быть в том индексе, который был создан)

  2. categoryTF.text отображаются правильно, но если я не выбрал снова и оставил е как бы то ни было. Он автоматически вернется к нулю в результатах, когда я нажму кнопку SaveButton. : I wi sh categoryTF.text вернется как созданный, и значение не изменится, даже если я его не трогал и нажал saveButton

В gif, показанном ниже, я выбрал row2 в качестве образца , и результат в Realm Browser показывает как есть. Я только изменил информацию amountTF.text с 1200 на 2000, и в результате браузер областей установит результат cateogoryType в сегменте controlcrol на «доход», а категория вернется к nil

образец рабочего процесса


//Data Model
//MARK: - Transaction Category Section
 enum CategoryType : String, CaseIterable {
     case income = "income"
     case expense = "expense"

     init?(id : Int) {
         if id < CategoryType.allCases.count {
             self = CategoryType.allCases[id]
         } else {
             return nil
         }
     }
 }



class Category : Object {
    @objc dynamic var type : String = CategoryType.income.rawValue
    @objc dynamic var name : String = ""

//    let parentCategory = LinkingObjects(fromType: Transaction.self, property: "ofCategory")
    convenience init(type:CategoryType, name: String) {
        self.init()
        self.type = type.rawValue
        self.name = name
    }

}
/* VC that should read and load all data to required place */

 //edit
    var selectedTransaction : Transaction!
 @IBOutlet weak var amountTF: UITextField!

    //PickerView for keyboard
    lazy var pickerView : UIPickerView = UIPickerView()
    //Segment Control
    @IBOutlet weak var categorySCoutlet: UISegmentedControl!
    @IBOutlet weak var categoryTF: UITextField!

 override func viewDidLoad() {
        super.viewDidLoad()
        amountTF.text! = selectedTransaction.amount
        categoryTF.text! = selectedTransaction.categoryType!.name

setupPicker()

    }

    @IBAction func categoryTypeSC(_ sender: UISegmentedControl) {
        guard let type = CategoryType(id: sender.selectedSegmentIndex) else {
            fatalError("error")
        }
        currentCategories = categories.filter("type == %@", type.rawValue)
        categoryTF.text = currentCategories.first?.name
        pickerView.reloadAllComponents()
        pickerView.selectRow(1, inComponent: 0, animated: true)
    }

 //MARK:- Add Transaction Btn
    @IBAction func addTransButtonTapped(_ sender: UIButton) {


    }



    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        if touches.first?.view == view {
            categoryTF.resignFirstResponder()
        }
    }


    //MARK:- Picker Helper
    func setupPicker() {
        currentCategories = categories.filter("type == %@", CategoryType.income.rawValue)
        categoryTF.inputView = pickerView

        pickerView.delegate = self
        pickerView.dataSource = self

        categorySCoutlet.setTitle("Income", forSegmentAt: 0)
        categorySCoutlet.setTitle("Expense", forSegmentAt: 1)
        categorySCoutlet.addTarget(self, action: #selector(categoryTypeSC(_:)), for: .valueChanged)

    }

1 Ответ

0 голосов
/ 24 апреля 2020

Вы вызываете tableView.deselectRow(at: indexPath, animated: false) в вашем tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) методе.

В результате возвращается неправильный indexPath в prepareForSegue.
. Вы должны либо удалить вызов deselectRow из метода didSelectRowAtIndexPath,
, либо создать свойство для хранения значение indexPath.
Примерно так:

// somewhere in your class
var selectedIndexPath: IndexPath?

затем

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let selectedRowForTrans : Transaction = getTransactions[indexPath.row]
    selectedIndexPath = indexPath // set the value of selectedIndexPath
    tableView.deselectRow(at: indexPath, animated: false)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if (segue.identifier == "editTrans") {
        if let indexPath = selectedIndexPath { // check if there is a valid indexPath
            let editTransVC = segue.destination as! AddTransactionTableViewController
            let selectedRowForTrans : Transaction = getTransactions[indexPath.row]
            editTransVC.selectedTransaction = selectedRowForTrans

        }
    }

}

Надеюсь, это поможет

...