从不同 ViewController 中的函数捕获 var |迅速

Posted

技术标签:

【中文标题】从不同 ViewController 中的函数捕获 var |迅速【英文标题】:Capture a var from a function in a different ViewController | Swift 【发布时间】:2017-09-06 14:33:40 【问题描述】:

我正在制作一个星座应用程序,在主视图控制器中,您可以单击一系列按钮来拉出一个弹出屏幕,该屏幕将显示他们的星座。

我有一个主要功能 buttonLayout(),它为我的 ViewController 制作所有按钮并设置它们的图像。

在您单击一个按钮后,我希望它弹出一个弹出窗口,其中包含他们在主视图控制器中单击的相同按钮

我大写的部分是我不知道该怎么做。

这是我的 ViewController 代码: // ViewController.swift // Zodiacv2

import UIKit

class ViewController: UIViewController 

@IBOutlet weak var headerLabel: UILabel! 
@IBOutlet weak var subHeaderLabel: UILabel!

override func viewDidLoad() 
    super.viewDidLoad()
    headerLayout()
    buttonLayout()


func headerLayout() 
    headerLabel.text = header
    subHeaderLabel.text = subHeader


func buttonLayout() 
    for index in 0..<9 
        var yPos = 195
        var xPos = (105 * index) + 50
        if (xPos >= 300) 
            yPos += 135
            xPos -= 315
        
        if (xPos >= 300) 
            yPos += 135
            xPos -= 315
        
        let button = UIButton()
        let buttonImage = UIImage(named: sign[index])
        button.setImage(buttonImage, for: .normal)
        button.frame = CGRect(x: xPos, y: yPos, width: 105, height: 130)
        button.tag = 5
        button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
        view.addSubview(button)
    


func buttonClicked() 
    let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PopUp") as! PopUpViewController
    self.addChildViewController(popOverVC)
    popOverVC.view.frame = self.view.frame
    self.view.addSubview(popOverVC.view)
    popOverVC.didMove(toParentViewController: self)

这是我的弹出视图控制器的代码:

//  PopUpViewController.swift
//  Zodiacv2
import UIKit

class PopUpViewController: UIViewController 

@IBOutlet weak var headerlabelPop: UILabel!

override func viewDidLoad() 
    super.viewDidLoad()
    self.showAnimate()
    self.headerlabelPop.text = subHeader


func showButton() 
    let vc = UIStoryboard(name: "PopUp", bundle: nil).instantiateViewController(withIdentifier: "Main") as! ViewController



func showAnimate() 
    self.view.transform = CGAffineTransform(scaleX: 1.3,y: 1.3)
    self.view.alpha = 0.0
    UIView.animate(withDuration: 0.25, animations: 
        self.view.alpha = 1.0
        self.view.transform = CGAffineTransform(scaleX: 1.0,y: 1.0)
    );


@IBAction func closePopUp(_ sender: UIButton) 
    removeAnimate()


func removeAnimate() 
    UIView.animate(withDuration: 0.25, animations: 
        self.view.transform = CGAffineTransform(scaleX: 1.3,y: 1.3)
        self.view.alpha = 0.0
    , completion: (finished : Bool) in
        if (finished) 
            self.view.removeFromSuperview()
        
    );

在 showButton 函数中,我想访问索引,以便我可以说 sign[index] 或 buttonLayout() 函数中的 UIButton 图像。

【问题讨论】:

button.tag = 5 => button.tag = index。将 var 添加到 seconds VC,并在呈现之前,显示它。另外,为什么要使用 ChildVC?从您的屏幕截图来看,推送可能是您真正想要做的。 我对 .tag 属性有点困惑。如果我把这行代码放进去,这是否意味着我的索引每次都是 5? @Larme 不,会是0、1等等。问题是为什么每次都放5?目标是什么?如果你把索引作为标签,那么你可以很容易地检索到索引。 你真的需要将一个按钮传递给新的视图控制器,而不仅仅是一个图像或图像名称吗? @Larme 我明白你在说什么!那行得通!谢谢! 【参考方案1】:

您可以将按钮的值注入新的视图控制器。 (这是您分享的代码中的代码)

func buttonClicked(_ sender: UIButton) 
    let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PopUp") as! PopUpViewController
    popOverVC.characteristic = sign[sender.tag]
    self.addChildViewController(popOverVC)
    popOverVC.view.frame = self.view.frame
    self.view.addSubview(popOverVC.view)
    popOverVC.didMove(toParentViewController: self)

但我会改变您呈现按钮的方式。 最好只使用UICollectionView,然后处理每个单元格的点击(使用UICollectionViewDelegate)。

【讨论】:

.characteristic 属性有什么作用?或者我应该问,我是否需要为 .characteristic 属性创建一个变量,因为当我将此代码放入 XCode 时,我收到一条错误消息,提示 PopUpViewController 没有成员特征。 是的,你需要在popUpViewController中创建一个。在那里,您将设置为呈现该视图而按下的按钮的值。

以上是关于从不同 ViewController 中的函数捕获 var |迅速的主要内容,如果未能解决你的问题,请参考以下文章

从加载它的 ViewController 调用详细 PageViewController 中的函数

如何从已解散的导航控制器中的文本视图中捕获最终值

Ionic - 如何正确导入 ViewController? - 未捕获(承诺):错误:没有 ViewController 的提供者

从 SQL Server 2005 中的用户定义函数中“捕获”错误

如何根据 iOS 中的两个条件从 AppDelegate 呈现两个不同的 ViewController?

从扩展调用 viewController 中的函数?