从其他 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 调用方法 |迅速的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ViewController 或其他地方调用或触发 AppDelegate 中的通知功能?
无法从 AppDelegate 调用 ViewController 方法