【问题标题】:Call method from other ViewController | Swift从其他 ViewController 调用方法 |迅速
【发布时间】: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

【问题讨论】:

    标签: ios swift view controller viewcontroller


    【解决方案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 中使用了错误的标识符。我更新了我的答案以反映您的“提交”标识符。我会布置一些断点以确保调用所有内容。如果没有,请确定代码在什么时候没有运行以及原因。
      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 2018-08-04
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多