2016-07-23 146 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中節省處理時間。