Назначение делегата от не родительского View Controller - PullRequest
0 голосов
/ 18 сентября 2018

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

Контроллер основного вида: (MVC) 1. У меня есть класс Main Viewcontroller (MVC).VC имеет свойство опций, к которым я хотел бы получить доступ из другого класса ViewController (AVC)

class ViewController: UIViewController {
var options: Options?


 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if (segue.identifier == "To Statements") {
        // pass data to next view
        let vc = segue.destination
        let statementVC = vc as! StatementsViewController
        statementVC.coreDataStack = coreDataStack
        statementVC.currentPerson = currentPerson

    }
}

extension ViewController: FormateStatementDelegate {

   // formatting protocol
   func addStatementFormat() -> Int {
     // here is where I would use the options var that is found in the (MVC)
   }
}

Statement ViewController: (SVC) 2. У меня есть оператор класса View ControllerViewController (SVC), который вызывается из (MVC).Я использую подготовку для segue func, чтобы настроить этот контроллер представления для (MVC).

    class StatementsViewController: UIViewController{

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "Add Statement") {
        // pass data to next view
        //print("segue to add statement")
        let vc = segue.destination
        let addStatementVC = vc as! AddStatementViewController
        addStatementVC.coreDataStack = coreDataStack
        addStatementVC.personName = currentPerson!.name!    
    }
    }

AddStatement View Controller (AVC) 3. У меня есть третий класс View Controller AddStatement ViewКонтроллер (AVC), который вызывается из (SVC).Я также использую подготовку для segue func, чтобы настроить этот контроллер представления из (SVC)

Этот класс имеет протокол, который я определяю в (MVC).

protocol FormateStatementDelegate {
func  func addStatementFormat() -> Intmal
}

class AddStatementViewController: UIViewController{
   var delegate FormateStatementDelegate! = nil
}

Где яя запутался, где установить свойство делегата.Кажется, что примеры, которые я видел, устанавливают свойство делегата при подготовке к функции seguer.Но так как (MVC) является тем, который соответствует протоколу FormateStatementDelegate, где и как я должен установить делегата в (AVC), так как они не имеют отношения родитель / потомок.Надеюсь, я объяснил это осмысленно.

1 Ответ

0 голосов
/ 18 сентября 2018

Ваш делегат объявлен как неявно развернутый необязательный:

class AddStatementViewController: UIViewController{
   var delegate FormateStatementDelegate! = nil
}

Будьте осторожны с этим.Если вы забудете установить делегат, приложение вылетит.Существует также потенциал для сильного цикла хранения , вызывающего утечку памяти.Общий шаблон, который я использую, состоит в том, чтобы объявить его слабым необязательным:

protocol FormateStatementDelegate: class {
    ...
}

class AddStatementViewController: UIViewController{
    weak var delegate: FormateStatementDelegate?

    func doSomething() {
        delegate?.addStatementFormat() // This statement will do nothing if delegate is nil
    }
}

Теперь перейдем к вашей проблеме: если я правильно понимаю описание вашей проблемы, порядок поиска будет следующим:

ViewContorller -> StatementViewController -> AddStatementViewController

И AddStatementViewController имеет делегата, которому ViewController соответствует.Вам просто нужно хранить ссылку на экземпляр MainViewController во втором контроллере представления:

class ViewController: UIViewController {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
        if (segue.identifier == "To Statements") {
            // pass data to next view
            let vc = segue.destination
            let statementVC = vc as! StatementsViewController
            statementVC.coreDataStack = coreDataStack
            statementVC.currentPerson = currentPerson
            statementVC.formateStatementDelegate = self
        }
    }
}

class StatementViewController {
    weak var formateStatementDelegate: FormateStatementDelegate?

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "Add Statement") {
            // pass data to next view
            //print("segue to add statement")
            let vc = segue.destination
            let addStatementVC = vc as! AddStatementViewController
            addStatementVC.coreDataStack = coreDataStack
            addStatementVC.personName = currentPerson!.name!    
            addStatementVC.delegate = formateStatementDelegate
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...