如何使用委托在Swift中执行Segue

时间:2016-07-04 21:50:38

标签: ios arrays swift delegates segue

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

我有vcMainvcIncomingFile的segue。 如何在-performSegueWithIdentifier:vcMain之间调用Core类中的vcIncoming方法。我的意思是我希望在Core类中有一个方法或委托或其他任何可以执行从vcMainvcIncomingFile的搜索。

class Core {
    func showIncomingVC(){ }
}

showIncomingVC函数中,我希望在performSeguevcMain之间vcIncomingFile
感谢

3 个答案:

答案 0 :(得分:0)

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类中创建一个协议,并在视图类中使用它的委托

答案 1 :(得分:0)

就这样做:

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)
    }
}

答案 2 :(得分:0)

要正确实现模式,我们需要知道您的Core类是否是模型的一部分,或者它是否是某种控制流机制。

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

例如,

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

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

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

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

这将使viewController中的所有模型到视觉逻辑保持原样。

如果您的Core类完全分离视图控制器(意味着视图控制器不知道如何访问Core的实例),您可能需要查看NSNotificationCenter并发送通知在Universe中为您的viewControllers异步提取。