【问题标题】:Swift - Run method from another classSwift - 从另一个类运行方法
【发布时间】:2015-06-29 13:55:45
【问题描述】:

我想知道如何从另一个类运行方法。例如,如下代码:

let newVC: ScoreViewController = ScoreViewController()
newVC.makeScore()

上面的代码对我不起作用,因为在makeScore() 中,我正在更改标签的文本,而上面的代码无法做到这一点,因为它正在创建一个新实例。有没有办法在不创建新实例的情况下调用要运行的方法,以便我可以更改 makeScore() 中的标签文本?

编辑:

ScoreViewController 是如何添加到 PageViewController 中的:

let vc = storyboard.instantiateViewControllerWithIdentifier("Score") as! ScoreViewController
self.addChildViewController(vc)
self.scrollView.addSubview(vc.view)

【问题讨论】:

  • 您的控制器是如何连接的?导航控制器,标签栏控制器?自定义转场?您需要将实例获取到该控制器,才能正确访问方法
  • 我所有的控制器都在一个滚动视图中。我无法创建视图控制器的新实例。
  • 可以添加故事板的截图吗?
  • 这不会有帮助。所有的视图控制器都没有在情节提要中连接。有PageViewController,里面有一个ScrollView,FirstViewController,ScoreViewController。在 PageViewController 的代码中,我将 FirstViewController 和 ScoreViewController 添加到 ScrollView 的子视图中。
  • 这将非常有帮助,了解图像中的听觉是如何的。

标签: ios swift


【解决方案1】:

我假设您在 FirstViewController 中有一些方法可以更改分数并将其显示在您的 ScoreViewController 中。委托模式是这个问题的可能解决方案。在您的FirstViewController 中创建一个用于更新分数的协议,例如:

protocol FirstVCScoreDelegate:NSObjectProtocol {

    func makeScore()
}

然后在你的 FirstViewController 中为这个委托创建一个 var:

var delegate: FirstVCScoreDelegate

然后在您的PageViewController 中创建FirstViewControllerScoreViewController 的实例,将FirstViewController 的委托设置为ScoreViewController

var firstVC: FirstViewController()
var scoreVC: ScoreViewController()
firstVC.delegate = scoreVC

在此之后,在您的方法中,FirstViewController 的分数正在发生变化:

@IBAction func scoreChangeAction(sender: AnyObject) {

        if delegate.respondsToSelector(Selector("makeScore")) {

            delegate.makeScore()
        }
    }

这将通知ScoreViewController 更新分数。您现在必须在 ScoreViewController 中实现委托方法:

extension ScoreViewController: ScoreDelegate {

    func makeScore() {
        //update your label
    }
}

我相信这会解决你的问题。

更新

在你的 PageViewControllerviewDidLoad: 方法中试试这个:

override func viewDidLoad() {
        super.viewDidLoad()

        let mainStoryboard = UIStoryboard(name: "MainStoryboard", bundle: NSBundle.mainBundle())

        let firstVC : FirstViewController = mainStoryboard.instantiateViewControllerWithIdentifier("firstVC") as FirstViewController

        let scoreVC : ScoreViewController = mainStoryboard.instantiateViewControllerWithIdentifier("scoreVC") as ScoreViewController

        firstVC.delegate = scoreVC

        self.addChildViewController(firstVC)
        self.addChildViewController(scoreVC)

        self.scrollView.addSubview(firstVC.view)
        self.scrollView.addSubview(firstVC.view)
    }

【讨论】:

  • 第一行报错Declaration is only valid at file scope
  • 如果解决方案有效,请接受答案。谢谢!
  • 最后一段代码出错了。我把它放在import UIKit下,报错说Use of undeclared type 'ScoreDelegate'
  • var delegate: FirstVCScoreDelegate 应该在你的类块内
  • 好的。第三位代码不起作用。错误说Variable 'scoreVC' used before being initialized
【解决方案2】:

在PageViewController中,声明一个属性:

class PageViewController {
    var scoreViewController:ScoreViewController
    // ....
 }

初始化 ScoreViewController 后:

let vc = storyboard.instantiateViewControllerWithIdentifier("Score") as! ScoreViewController

将其作为属性保存:

self.scoreViewController = vc

然后使用

self.scoreViewController.makeScore()

【讨论】:

  • 最后两行出现错误:'FirstViewController' does not have a member named 'ScoreViewController'。我应该做点别的吗?
  • @Smecla 好吧,在你分配一个属性之前,你当然应该在类中声明它。
  • 当我插入该行时,PageViewController 类显示以下错误:Class 'PageviewController' has no initializers
  • 如果你不需要初始化器,只需使用var scoreViewController:ScoreViewController? 使其成为可选的。并使用self.scoreViewController!.makeScore() 调用它。
  • 我不确定您使用的是哪个版本的 Xcode。也许你可以试试self.scoreViewController?.makeScore(),或者使用let 来解开它。这种错误很容易修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2016-11-27
  • 2023-02-10
  • 1970-01-01
  • 2014-05-16
  • 2014-05-29
  • 2011-04-29
相关资源
最近更新 更多