Я впервые использую управление сегментами и область. поэтому в настоящее время я использую 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;
}
- amountTF.text = selectedTransaction .amount (сделано и исправлено)
- categorySCoutlet.selectedSegmentIndex = selectedTransaction.categoryType.type (не удается отобразить сегментный индекс в selectedTransaction.categoryType.type)
- categoryTF.text = selectedTransaction.categoryType.name (имя отображается правильно, однако вернет ноль, если пользователь снова НЕ ПЕРЕСЕЛИТ)
Я ожидал, что все данные отображаются как если он создан.
Тем не менее, я столкнулся с двумя проблемами при выполнении этого
Выбранный индекс SegmentControl всегда в 0 вместо selectedTransaction.categoryType.name (я хочу контроль сегмента должен быть в том индексе, который был создан)
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)
}