2016-07-23 65 views
-1

我想两个控制器之间使用委托,但它不工作,因为它应该是斯威夫特代表不工作

protocol saveDelegate: class { 
    func saveSite() 
} 
class AuditSiteViewController: UIViewController { 
    weak var delegate: saveDelegate? 

    @IBAction func saveButton(sender: UIBarButtonItem) { 
     print("Saved") 
     delegate?.saveSite() 
    } 
} 


class AuditDetailsViewController: UIViewController, saveDelegate { 
    var mainView: AuditSiteViewController? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     mainView?.delegate = self 

    } 

    func saveSite() { 
     print("delegated") 
    } 
} 

它是否打印委派,但只打印“拯救”?

+0

我试图从另一个viewcontroller救火功能,我不应该使用代表?或者是什么? – Abdoelrhman

+0

我试图创建它作为一个实例,但我仍然没有任何东西,我只是关注它的在线资源,使其工作,所以这就是我得到的,我该如何解决?如果可能的话用代码? – Abdoelrhman

+0

你有一个调试器。一个美妙的调试器。调试! – matt

回答

0

你可以使用委托,但你有调试和检查mainView是正确的实例吗?

我在这种情况下的建议是使用NSNotification来代替。您可以在viewDidLoadsaveButton()

class AuditDetailsViewController: UIViewController { 

    override func viewDidLoad() { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(AuditDetailsViewController.saveSite), name: "SaveSite", object: nil) 
    } 
} 

class AuditSiteViewController: UIViewController { 

    @IBAction func saveButton(sender: UIBarButtonItem) { 
    NSNotificationCenter.defaultCenter().postNotificationName("SaveSite", object: nil) 
    } 
} 
0

添加一个观察者和发布通知。在我看来,只有两个可能的原因:

第一: 在呼吁mainView?.delegate = self MAINVIEW为零的时刻。然后代表未分配。在那里设置一个断点,你会看到它。

第二个: 在致电delegate?.saveSite()的那一刻,代表是零。这可能是因为您的AuditDetailsViewController实例已被您或系统取消。如果没有人再强调它的话,系统会移除该实例。实现deinit方法并在其中设置断点以查看它何时发生。

0

当您设置委托时,看起来像mainView是nil。尝试在实例化详细视图控制器时设置引用。

无论如何,也许你想要的是将保存操作从detailViewController委托给AuditSiteViewController,并在最后一个VC中节省处理时间。