从其他 ViewController 调用方法 |迅速

Posted

技术标签:

【中文标题】从其他 ViewController 调用方法 |迅速【英文标题】:Call method from other ViewController | Swift 【发布时间】:2016-05-25 14:21:15 【问题描述】:

我搜索了很多问题来解决这个问题,但没有人帮助我。 有 2 个视图控制器,我需要将数组从一个发送到另一个。

第一个viewController中的调用方法:

   SubmitViewController.acceptContent(content)

在其他方面接受:

var contentAccepted = [String]()

class func acceptContent(content: [String])

    contentAccepted = content


问题出在 contentAccepted 行上的错误:Instance member cannot be used on type UIViewController

【问题讨论】:

【参考方案1】:

你在你的类型方法中引用了自我。 以下是苹果对此事的看法:

在类型方法体中,隐含的 self 属性指的是 类型本身,而不是该类型的实例。对于结构 和枚举,这意味着您可以使用 self 来消除歧义 在类型属性和类型方法参数之间,就像你为 实例属性和实例方法参数。

更一般地说,您使用的任何非限定方法和属性名称 在类型方法的主体内将引用其他类型级别 方法和属性。一个类型方法可以调用另一个类型方法 使用另一个方法的名称,而无需在其前面加上 键入名称。同样,结构和枚举的类型方法可以 通过使用类型属性的名称访问类型属性,而不使用 类型名称前缀。

More info on type-methods (class-methods) can be found here

试着那样做:

var contentAccepted = [String]()

class func acceptContent(content: [String])

    ViewController().contentAccepted = content


确保您确实需要类型方法。

【讨论】:

【参考方案2】:

您遇到的问题是contentAccepted 是一个实例变量(应该是),acceptContent() 是一个类方法。因此,您的方法无法访问您的变量。您需要先创建SubmitViewController 的实例,然后才能访问其变量。

let submitViewController = SubmitViewController()
submitViewController.contentAccepted = content

通过首先创建一个 SubmitViewController 实例,您现在可以访问该实例变量。

如果您在 segue 中将信息从一个视图控制器传递到另一个视图控制器,您可以考虑使用prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

        if segue.identifier == "Submit" 
            if let view = segue.destinationViewController as? SubmitViewController 
                view.contentAccepted = content // If content is an instance variable
            

        
    

【讨论】:

好的,所以当我将数组从第一个视图发送到另一个视图时,我当前的视图是第二个,接受的数组是空的。为什么? 有没有可能你没有给你的第二个视图控制器一个标识符?对此进行测试的一种方法是删除if segue.identifier .... 位。我在 View Controller 中使用它,我知道会有几个 segue。如果您知道segue 将成为SubmitViewController 的事实,那么请在不使用if 语句的情况下对其进行测试。 我使用 performSegueWithIdentifier("Submit", sender: self) 按钮来更改视图。那么我怎样才能仍然使用按钮和 prepareForSegue? performSegueWithIdentifier 会自动触发prepareForSegue。因此,问题可能是您的 segue 未命名(在情节提要中),或者您在 prepareForSegue 中使用了错误的标识符。我更新了我的答案以反映您的“提交”标识符。我会布置一些断点以确保调用所有内容。如果没有,请确定代码在什么时候没有运行以及原因。

以上是关于从其他 ViewController 调用方法 |迅速的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 中的其他类调用方法

如何从 ViewController 或其他地方调用或触发 AppDelegate 中的通知功能?

无法从 AppDelegate 调用 ViewController 方法

从 ViewController 调用 nib 方法

从 App Delegate 调用 ViewController 的方法

如何从 AppDelegate.m 调用 ViewController.m 方法