将数据从 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)
这应该有效!
想法在按下容器视图中的按钮(使用 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)
这应该有效!