Перемещать другую данные об одном view с protocol's

Имея следующий код:

ViewController2:

import UIKit

protocol TransferirTexto {

    func transferir(texto : String)

}

class SecondViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    var delegate : TransferirTexto?


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }




    @IBAction func transferirDato(sender: AnyObject) {

        delegate?.transferir(textField.text!)
        self.navigationController?.popViewControllerAnimated(true)
    }

}

ViewController1:

import UIKit

class ViewController: UIViewController, TransferirTexto {

    @IBOutlet weak var miLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }



    func transferir(texto: String) {
        miLabel.text = texto
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let svc = segue.destinationViewController as! SecondViewController

        svc.delegate = self

    }

}

Как функционирует тема делегатов в этом случае? Изменив другому один viewController, первый viewController не разрушается? Сомнение появляется из, как я делаю, чтобы перемещать его один .delegate = self если viewController идет разрушать?

1
задан 11.04.2016, 19:52
2 ответа

Это просто, я оставляю тебе пример для того, чтобы ты увидел функционирование.

ViewController 1:

 class ViewController1 : UIViewcontroller, MenuTableProtocol {
            if let menuTable = NSBundle.mainBundle().loadNibNamed("MenuTableView", owner: self, options: nil).first as? MenuTableView {
                let items = ["Item1","Item2"]
                menuTable.items = items
                menuTable.tblDelegate = self //Aqui le estamos diciendo que yo Viewcontroller1 me hago cargo del delegado
                self.view.addSubview(menuTable)
            }

/**
    Aqui implementamos la función del Protocolo que nos interesa manejar
    */
    func didSelect(referenceItem: String) {
        let vc = self.storyboard?.instantiateViewControllerWithIdentifier(referenceItem)
            self.navigationController?.pushViewController(vc!, animated: true)
    }
}

ViewController 2:

    class ViewController2 : UIViewController {
//Lo siguiente sirve para que al instanciar la clase ViewController2 el controlador que quiera se puede hacer cargo de este protocolo
        var tblDelegate:MenuTableProtocol!

        func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath:   NSIndexPath) {
            //Aqui estamos empujando al delegado a que actúe
            self.tblDelegate.didSelect!(items[indexPath.row].reference)
        }

    }

- поскольку они сказали тебе ViewController1 и ViewController2, они продолжают существовать, в ningГєn момент исчезают stack, просто создают одну conexiГіn между обоими и общаются, что для этого, для чего служат Протоколы. Приветствие!

1
ответ дан 24.11.2019, 14:36

Сначала инстанция ViewController1. С там инстанции второй в prepareForSegue. Там у тебя есть 2 нагруженных драйвера, не был разрушен ни один. С svc.delegate = self его показывает в ViewContrller2, как я смог соглашаться на ViewController1 (делегат не прекращает быть указателем в другой драйвер). С ViewController2, когда ты перемещаешь информацию первого используя, уполномочь тебя? переносить (textField.text!), ViewController1 продолжает указывать на этот указатель в, так что к нему прибывает информация, и когда ты делаешь self.navigationController? .popViewControllerAnimated (true) он, когда загружается ViewController2, но не ViewController1.

Другая важная вещь, которую ты должен делать,, - когда ты заявишь делегат, сделай это таким: weak var уполномочь тебя: TransferirTexto?

Представь себе то, что на делегатов указали наоборот, в месте, которое ViewController2 было бы у делегата обозначаясь в ViewController1, ViewController1 тот, у которого есть один, уполномочь тебя = ViewController2 и в определенном моменте ты делаешь popViewControllerAnimated и ViewController2 исчезает. DesdeViewController1 ты продолжаешь иметь делегата указывая на что-то, что уже не существует, и это не нравится ничто Свифту. Поместив это weak, когда он разрушается ViewController2, делегат остается в nil, так что, когда ты это выполнишь, он не делает опциональному существу и он ничего не перемещает

0
ответ дан 24.11.2019, 14:36