You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用Segue在ViewController与独立UIView间传递数据?

不使用Segue在ViewController与独立UIView间传递数据的解决方案

问题核心错误分析

你当前的实现存在两个关键问题:

  1. 在HesapView中通过AnasayfaVC().anaHesapBakiye获取数据时,是创建了一个全新的AnasayfaVC实例,而非当前正在显示的ViewController,因此无法拿到已经从Parse获取到的真实数据。
  2. 尝试传递数据时用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:24:57