不能在另一个文件中使用函数

Posted

技术标签:

【中文标题】不能在另一个文件中使用函数【英文标题】:Cant use Functions in one file in another 【发布时间】:2016-06-18 01:42:28 【问题描述】:

我创建了一个名为“Util.swift”的文件,它有一个类“类 VC: UIViewController”并有两个函数:

Next(segue: String) 
    performSegueWithIdentifier(segue, completion: nil)


Back() 
    dismissViewControllerAnimated(true, completion: nil)

所以基本上,这些函数只是告诉当前的 viewController 去下一个 View 还是回到上一个 View。

但是,在另一个文件中,我有一个附加到按钮的 IBAction,在该操作中,我通过执行以下操作调用 Util 文件中的函数“Back”:

@IBACTION func ~~~ 
    nextVC = Util()
    nextVC.back()

但是,当我单击按钮时,它什么也没做。

当我尝试通过执行相同操作并输入 segue indetifier 参数将另一个按钮连接到调用 Util 文件中的“next”函数的操作时,它显示 SIGABRT 错误:没有名为“xxx”的 segue 标识符。

谁能帮帮我?我应该简单地使用 XIB 而不是使用 segues 吗?

【问题讨论】:

你为什么要把这些函数放在另一个类中?找不到 segue 的原因是您只是使用初始化程序而不是从情节提要创建 Util,因此它与情节提要无关。 @Paulw11,您应该充实您的评论并将其发布为答案。 【参考方案1】:

您必须使用storyBoardXIB 初始化UIViewController。如果您正在使用工厂 init() 方法,那么它不会为您做任何事情;这意味着,这不是与storyBoardXIB 关联的viewController。因此,您需要做的就是使用任一选项实例化 viewController。在此之前,您需要为viewController 设置一个identifier 来实例化它。

let storyBoard = UIStoryBoard(name: "MainStoryBoard", bundle: nil)
let vc = storyBoard.instanstiateViewControllerWithIdentifier("YOUR_IDENTIFIER") as! Util
//call your Next method like this
vc.Next(segue:"identifier")

请参考文档 Apple Doc

【讨论】:

【参考方案2】:

为了使用 segue,视图控制器实例需要与 Storyboard 相关联。为了与故事板关联,视图控制器实例要么需要是 segue 的结果,要么需要通过 instantiateViewControllerWithIdentifier 从故事板实例化。

当您通过Util() 创建Util 的实例时,您有一个与情节提要无关的视图控制器实例,并且实际上并未显示在屏幕上。

因此,当您尝试执行转场时,您会收到错误,因为找不到转场。

此外,当您尝试关闭 back() 中的视图控制器时,您正在尝试关闭未显示的视图控制器。

我不知道你为什么要在 nextback 中包装两个相当简单的函数,但是你可以为你的所有视图控制器使用一个超类来做到这一点,并让这个超类实现你的 next 和 @ 987654328@函数:

class MyViewContollerSuperclass: UIViewController 

    func next(segue: String) 
        self.performSegueWithIdentifier(segue, sender: self)
    

    func back() 
        self.dismissViewControllerAnimated(true, completion: nil)
    

那么你实际的视图控制器将被声明为:

   class MyActualViewController: MyViewContollerSuperclass 

       @IBACTION func ~~~ 
           self.back()
       
   

【讨论】:

我有很多情节提要,每个视图上都有“返回”和“下一步”按钮。我不想一遍又一遍地输入“perfromsegue”和“dismissViewController”,所以我创建了“next”和“back”。

以上是关于不能在另一个文件中使用函数的主要内容,如果未能解决你的问题,请参考以下文章

使用在方案文件中定义的函数,在另一个方案文件中

如何在另一个公共 js 文件中使用函数

我们可以在另一个 JS 文件中调用用一个 JavaScript 编写的函数吗?

Cgo 可以调用在另一个目录中声明的 C 函数吗?

如果它们在另一个 php 文件中,则不能调用它们?

我们可以在另一个JS文件中调用用一个JavaScript编写的函数吗?