【问题标题】:How to use delegate to performSegue in Swift如何在 Swift 中使用委托来执行Segue
【发布时间】:2016-07-04 21:50:38
【问题描述】:

我有 3 个类:
Core 不继承自任何类。
vcMainvcIncomingFile 都继承自 UIViewController

我有一个从vcMainvcIncomingFile 的转场。 如何在 vcMainvcIncoming 之间从 Core 类调用 -performSegueWithIdentifier: 方法。我的意思是我想在 Core 类中有一个方法或委托或其他任何东西,可以从 vcMain 执行Segue 到 vcIncomingFile

class Core {
    func showIncomingVC(){ }
}

showIncomingVC函数中,我想performSeguevcMainvcIncomingFile之间。
谢谢

【问题讨论】:

  • Core 是如何以及在哪里实例化的?
  • 核心是网络通信类。它在另一个名为 vcAcceptance 的类中实例化。它从网络发送、分析和接收命令。

标签: ios arrays swift delegates segue


【解决方案1】:

要正确实现模式,我们需要知道您的核心类是模型的一部分还是某种控制流机制。

如果它是模型的一部分,它应该对视图控制器一无所知,但视图控制器可以访问它。在这种情况下,您的视图控制器可以实现某种委托协议,并通过将自己分配为 Core 功能的某些部分的委托来从您的 Core 类建立调用路径。然后,Core 可以通过调用协议中定义的方法来触发其委托中的任何预定义行为。

例如,

如果您使用名为 fileReceived() 的方法定义名为 FileEventDelegate 的协议。

然后,向您的 Core 类添加一个名为 fileEventDelegate 的 FileEventDelegate 类型的成员?

每当Core 类接收到一个文件,它就可以调用fileEventDelegate?.fileReceived()。将自己注册为委托的任何类实现协议的对象实例将从那里处理它。
单元测试类也可以是委托,甚至不需要也不需要执行 segue。
您的 Core 类甚至可以在没有设置委托的情况下工作。

在 UI 方面,您的 VcMain 类可以通过定义调用 performSegueWithIdentifier(...) 的 fileReceived() 函数来实现 FileEventDelegate 协议。在 viewLoaded() 上,它可以将自己设置为正在使用的 Core 类实例的 fileEventDelegate。

这会将所有模型到视觉的逻辑保留在它所属的 viewController 中。

如果您的 Core 类在视图控制器完全分离的情况下工作(意味着视图控制器不知道如何访问 Core 的实例),您可能需要查看 NSNotificationCenter 并在让您的 viewControllers 异步拾取的宇宙。

【讨论】:

  • 非常感谢。我用它定义了协议和方法。对于 vcMain,我实现了协议并使其符合它。我将protocolDelegate 的成员添加到Core。但是现在如何以及在哪里注册代表?我的意思是这一行“对象实例,无论哪个类实现了协议,将自身注册为委托,将从那里处理它。”
  • 非常感谢。我用它定义了协议和方法。对于 vcMain,我实现了协议并使其符合它。我将protocolDelegate 的成员添加到Core。但是现在如何以及在哪里注册代表?我的意思是这一行“对象实例,无论哪个类实现了协议,都将自己注册为委托,将从那里处理它。” @alain-t
  • 关于“注册自身”的假设是您的视图控制器可以实例化或查找 Core 类的实例并将其 fileEventDelegate 属性设置为 self。例如,如果您的 Core 类有一个带有该类实例的单例(例如,静态变量,如 sharedInstance),那么您的 vcMain 可以在其 ViewDidLoad 方法中执行 Core.shareInstance.fileEventDelegate = self。
【解决方案2】:

Core 需要属于UIViewController 或继承UIViewController 的某个类,因为performSegueWithIdentifier 是UIViewController 的一个函数

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/instm/UIViewController/performSegueWithIdentifier:sender:

您可以改为使用协议。使用 func showIncomingVC(){ } 在您的核心类中创建一个协议,并在您的视图类中使用它的委托

【讨论】:

  • 是的,我知道我可以让 Core 成为 UIViewController 的子类,但是 MVC 模式会出错。我想使用协议和委托。但我不知道到底是怎么回事,我搜索了一下,但我遇到了一些错误。你能解释一下如何使用代表吗?谢谢
  • 上面的答案是使用协议和类的简单方法,只需更改您在结构内部故事板中使用的标识符名称
【解决方案3】:

就这样做吧:

struct Segue {
    let sourceVC: UIViewController
    let sender: AnyObject
    let identifier: String
}

protocol SegueProtocol: class {
    var segue: Segue { get }
}

class Core {
    weak var delegate: SegueProtocol?
    func perform() {
        guard let segue = delegate?.segue else {
            return
        }
        segue.sourceVC.performSegueWithIdentifier(segue.identifier, sender: segue.sender)
    }
}

【讨论】:

  • 谢谢,在结构关闭中:我收到 UIViewController 的错误“使用未声明的类型“UIViewController”我该如何解决?
  • 谢谢我忘了导入 UIKit。错误已解决。
  • @BehdadAhmadi 只需导入 UIKit
  • 非常感谢。只是如何以及在哪里讲述我的 Segue 标识符?对不起,如果觉得这个问题很愚蠢。
  • @BehdadAhmadi 你应该让你的视图控制器确认到 SegueProtocol。所有信息都在segue中。然后将其设置为 Core 的委托。只需调用 perform()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2019-08-15
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多