将数据从 Container View 不带 Segue 传递到 MainVC

Passing Data with without Segue from Container View to MainVC

想法在按下容器视图中的按钮(使用 ViewController)后将值 trackNumber 发送到 Main ViewController 到 recivedTrackNumber 而无需 segue 因为它们在同一视图中。如何通知主视图控制器(recivedTrackNumber)trackNumber 的值?

容器视图(带有 ViewController)看起来像带有按钮

 import UIKit
 class SelectSoundVC: UIViewController {

   var trackNumber: Int!

   @IBAction func winterSoundBut(_ sender: UIButton) {
    trackNumber = 1

  } 

}

和主要 ViewController

class MainVC: UIViewController {

   var recivedTrackNumber: Int!

}

Main.storyboard Screenshot

您可以使用 prepareForSegue(_:) 在初始化时检索对嵌入式视图控制器的强引用。只需在 Storyboard

中将您的 segue 标识符设置为 "EmbedSegue"
// MainVC
private var embeddedViewController: SelectSoundVC?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? SelectSoundVC,
        segue.identifier == "EmbedSegue" {
        self.embeddedViewController = vc
    }
}

同时将您的曲目 属性 更改为可选曲目,因为无法选择任何曲目。

// SelectSoundVC
var trackNumber: Int?

然后您可以从 MainVC 中的任何位置检索您的曲目编号:

// Here you can access to the trackNumber property, no need to duplicate its value (Single Responsability)
if let embeddedViewController = self.embeddedViewController, let trackNumber = embeddedViewController.trackNumber {
    print("Track Number \(trackNumber)")
}

Delegate 模式应该可以帮到你。首先你需要委托协议:

protocol SelectSoundVCDelegate {
    func didSelectTrackNumber(_ trackNumber: Int)
}

具有接受 trackNumber 值的函数。接下来,您需要在 SelectSoundVC:

中创建 delegate 属性
class SelectSoundVC: UIViewController {

    weak var delegate: SelectSoundVCDelegate?
    var trackNumber: Int!

    @IBAction func winterSoundBut(_ sender: UIButton) {
        trackNumber = 1
        delegate?.didSelectTrackNumber(trackNumber)
    } 

}  

将在 @IBAction 中调用 didSelectTrackNumber。注意 delegate 属性 应该是 weak 以避免引用循环。最后一步,在 MainVC 你应该设置 delegate 属性 of SelectSoundVC:

selectSoundVC.delegate = self  

这部分有点棘手,因为您需要 SelectSoundVC 的实例来设置委托。可以在prepareFoSegue方法中设置,例如:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let viewController = segue.destination as? SelectSoundVC, segue.identifier == "SelectSoundVC" {
        viewController.delegate = self
    }
}

第三种方法;-)
如果您从代码(从 MainVC)实例化第二个视图控制器,那么您可以轻松访问该变量:

let selectSoundVC = SelectSoundVC()
recivedTrackNumber = selectSoundVC.trackNumber
present(selectSoundVC, animated: true, completion: nil)

这应该有效!