【问题标题】:Passing Data with without Segue from Container View to MainVC不使用 Segue 将数据从容器视图传递到 MainVC
【发布时间】:2018-01-13 12:45:29
【问题描述】:

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

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

 import UIKit
 class SelectSoundVC: UIViewController {

   var trackNumber: Int!

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

  } 

}

和主视图控制器

class MainVC: UIViewController {

   var recivedTrackNumber: Int!

}

Main.storyboard Screenshot

【问题讨论】:

  • 同一个视图是什么意思???
  • 更新截图请看。主 VC 中的容器视图。这就是我的意思。

标签: ios swift containers segue viewcontroller


【解决方案1】:

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 属性应该很弱以避免引用循环。最后一步,在MainVC中设置SelectSoundVCdelegate属性:

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
    }
}

【讨论】:

  • 这对于prepareForSegue的提示非常有效。
【解决方案2】:

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

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

这应该可行!

【讨论】:

    【解决方案3】:

    您可以使用 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)")
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多