如何不使用Segue在ViewController与独立UIView间传递数据?
不使用Segue在ViewController与独立UIView间传递数据的解决方案
问题核心错误分析
你当前的实现存在两个关键问题:
- 在
HesapView中通过AnasayfaVC().anaHesapBakiye获取数据时,是创建了一个全新的AnasayfaVC实例,而非当前正在显示的ViewController,因此无法拿到已经从Parse获取到的真实数据。 - 尝试传递数据时用了
let iuView = UIView(),这是创建了基类UIView对象,不是自定义的HesapView,自然无法访问自定义属性。
解决方案步骤
1. 改造自定义UIView(HesapView)
给HesapView添加存储数据的属性,并封装UI更新方法,避免直接依赖ViewController:
import UIKit import Parse class HesapView: UIView { @IBOutlet weak var bakiyeLabel: UILabel! @IBOutlet weak var bakiyeTLabel: UILabel! @IBOutlet weak var ibanOrKartLabel: UILabel! @IBOutlet weak var ayrintiButton: UIButton! @IBOutlet weak var segmentControl: UISegmentedControl! // 新增存储数据的属性 var accountBalance: String = "" var accountIBAN: String = "" var cardLimit: String = "" var cardNumber: String = "" @IBAction func buttonTapped(_ sender: Any) { switch segmentControl.selectedSegmentIndex { case 0: print("hesap") case 1 : print("kart") default: break } } @IBAction func segmentControlTapped(_ sender: Any) { updateDisplayedContent() } // 封装UI更新方法 func updateDisplayedContent() { switch segmentControl.selectedSegmentIndex { case 0: bakiyeLabel.text = "Kullanılabilir Bakiye" bakiyeTLabel.text = "\(accountBalance) ₺" ibanOrKartLabel.text = accountIBAN ayrintiButton.setTitle("Tüm Hesaplar >", for: .normal) case 1 : bakiyeLabel.text = "Kullanılabilir Limit" bakiyeTLabel.text = "\(cardLimit) ₺" ibanOrKartLabel.text = "Kart Numarası: \(cardNumber)" ayrintiButton.setTitle("Tüm Kartlar >", for: .normal) default: break } } }
2. 在ViewController中正确传递数据
确保ViewController持有HesapView的引用(通过Storyboard/XIB关联IBOutlet),在Parse数据获取完成后,直接给HesapView的属性赋值并触发UI更新:
import UIKit import Parse class AnasayfaVC: UIViewController { // 关联Storyboard/XIB中的HesapView @IBOutlet weak var hesapView: HesapView! // 存储从Parse获取的数据 private var fetchedAccountBalance: String = "" private var fetchedAccountIBAN: String = "" private var fetchedCardLimit: String = "" private var fetchedCardNumber: String = "" override func viewDidLoad() { super.viewDidLoad() fetchDataFromParse() } func fetchDataFromParse() { // 查询账户数据 let accountQuery = PFQuery(className: "Hesaplar") accountQuery.whereKey("objectId", equalTo: "3gBzkj3Bk1") accountQuery.findObjectsInBackground { [weak self] objects, error in guard let self = self else { return } if let error = error { self.showAlert(title: "Hata", message: error.localizedDescription) } else if let objects = objects { for object in objects { if let balance = object.object(forKey: "bakiye") as? String { self.fetchedAccountBalance = balance } if let iban = object.object(forKey: "hesapNo") as? String { self.fetchedAccountIBAN = iban } // 数据更新后同步到HesapView self.syncDataToHesapView() } } } // 查询卡片数据 let cardQuery = PFQuery(className: "Kartlar") cardQuery.whereKey("kartNo", equalTo: "5026722530589834") cardQuery.findObjectsInBackground { [weak self] objects, error in guard let self = self else { return } if let error = error { self.showAlert(title: "Hata", message: error.localizedDescription) } else if let objects = objects { for object in objects { if let number = object.object(forKey: "kartNo") as? String { self.fetchedCardNumber = number } if let limit = object.object(forKey: "kalanLimit") as? String { self.fetchedCardLimit = limit } // 数据更新后同步到HesapView self.syncDataToHesapView() } } } } // 传递数据到HesapView并触发UI更新 private func syncDataToHesapView() { hesapView.accountBalance = fetchedAccountBalance hesapView.accountIBAN = fetchedAccountIBAN hesapView.cardLimit = fetchedCardLimit hesapView.cardNumber = fetchedCardNumber hesapView.updateDisplayedContent() } private func showAlert(title: String, message: String) { let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Tamam", style: .default)) present(alert, animated: true) } }
内容的提问来源于stack exchange,提问作者selim
相关产品推荐
相关产品推荐

