2016-07-23 3 views
-1

Я пытаюсь использовать делегат между двумя контроллерами, но он не работает, как это должно бытьSwift делегаты не работает

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

Я пытаюсь запустить функцию сохранения из другого диспетчера представлений, не следует ли использовать делегатов? или что? – Abdoelrhman

+0

Я попытался создать его как экземпляр, но у меня все еще ничего не было, я просто следил за онлайновыми ресурсами, чтобы заставить его работать, вот что я получил, как я могу это решить? с кодом, если это возможно? – Abdoelrhman

+0

У вас есть отладчик. Замечательный отладчик. Отлаживать! – matt

ответ

0

Вы можете использовать делегат, но вы отлаживаете и проверяете, что mainView - правильный экземпляр?

Мое предложение в этом случае было бы использовать NSNotification. Вы можете добавить наблюдателя в вашем viewDidLoad и опубликовать уведомление о saveButton()

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 равен нулю, когда вы устанавливаете делегат. Попробуйте установить ссылку при создании экземпляра контроллера подробного представления.

В любом случае, возможно, вы хотите делегировать действие сохранения из элемента detailViewController в AuditSiteViewController и обработать в этом последнем VC сбережения.