2015-12-31 2 views
1

Я прочитал Trying to understand protocol/delegates in Swift, Passing data back from view controllers Xcode и Pass data when dismiss modal viewController in swift, пытаясь передать некоторые данные взад и вперед. Я думаю, что я сделал именно то, о чем еще писали сообщения, данные не передаются. Я что-то упускаю, и я понятия не имею, что. Если бы вы могли указать, что это такое, это было бы так здорово. Заранее спасибо :)Использование протоколов для передачи данных

Я также хотел бы упомянуть, что я представил TaskMessageViewController с использованием модального сегмента. И я хочу отправить данные обратно на мой TaskListViewController. В настоящее время я использую unwindToSegue, чтобы вернуться к TaskListViewController.

В моем Protocols.swift файл, у меня есть следующий код:

import Foundation 

protocol ReceiveMessageDelegate { 
    func receiveMessageFromTaskMessageViewController (message: String) 
} 

И в моих декларациях наследство, у меня есть:

class TaskListViewController: UIViewController, ReceiveMessageDelegate 

и в моем TaskListViewController.swift, я писал:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let taskMessageViewController = TaskMessageViewController() 
    taskMessageViewController.delegate = self 

} 

func receiveMessageFromTaskMessageViewController (message: String) { 
    print(message) 
    print("Protocol works!") 
} 

И в моем TaskMessageViewController.swift, я написал:

var delegate: ReceiveMessageDelegate? 
@IBAction func doneButtonTapped(sender: AnyObject) { 
    self.delegate?.receiveMessageFromTaskMessageViewController("message from message View Controller") 
} 

При нажатии на кнопку done на тренажере, то doneButtonTapped запускается на выполнение. Однако print("Protocol Works") никогда не будет выполнен. У кого-нибудь есть предложения?

+0

Как вы представляете диспетчер представлений модально? Если это происходит через segue, вам нужно перехватить целевой элемент управления segue, бросить его как TaskMessageViewController и установить делегат на этом объекте. – Ian

+0

Я представил контроллер вида с помощью segue. Но проблема в том, что я использовал 'unindToSegue', чтобы избавиться от модального представления, и я пытаюсь передать данные из модального представления обратно в мой контроллер представления. – aejhyun

ответ

0

Я снова прочитал ваш вопрос. И я вижу, вы используете unwind segue. Поэтому вам не нужно делегировать передачу сообщения. Вы должны сделать так:

В TaskMessageViewController.swift, определить переменную message и переопределить функцию prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "identifierUnwind" { 
     message = message 
    } 
} 

И ваш TaskListViewController.swift, вы можете получить его:

@IBAction func unwindToSegue (segue : UIStoryboardSegue) { 
     if let taskMessageViewController = segue.sourceViewController as? TaskMessageViewController 
     print(taskMessageViewController.message) 
     //OR save and do anything with it here. 
     } 
} 
+0

Я поставил следующий код в свой 'TaskListViewController.swift':' @IBAction func unindToSegue (segue: UIStoryboardSegue) { если пусть taskMessageViewController = segue.sourceViewController, как? TaskMessageViewController { taskMessageViewController.delegate = само } } ' – aejhyun

+0

Однако это все еще не вызывает выполнение операторов печати. – aejhyun

+0

вы можете добавить в '@IBAction func doneButtonTapped (отправитель: AnyObject)' this line: 'print (self.delegate?)' И дать мне результат. –

1

Если вы хотите передавать сообщения между контроллерами представлений в swift, вам вообще не нужно создавать свой собственный протокол. Если вы пытаетесь передать данные при отключении контроллера модального представления, вы, как правило, можете идентифицировать представленный контроллер представлений и получить доступ к его свойствам, указав контрольный элемент представления segue.

В этом случае причина, по которой сообщение не печатается, заключается в том, что вы присваиваете себя делегату экземпляра «taskMessageViewController», который является локальной константой метода viewDidLoad(), а taskMessageViewController никогда не избегает viewDidLoad (). Вы никогда не устанавливали делегата себя.

+0

Это хороший момент. Так что я 'пусть taskMessageViewController = TaskMessageViewController() переопределения функ viewDidLoad() { super.viewDidLoad() taskMessageViewController.delegate = self } 'Однако это все еще не приводит к выполнению оператора печати: (Иными словами, я объявлял' let taskMessageViewController = TaskMessageViewController() 'вне функции' videwDidLoad'. – aejhyun

+0

Причина в том, что вы вызываете метод receiveMessageFromTaskMessageViewController на делегате self, а не на делете делегата taskMessageViewController, который вы установили. Вы никогда не устанавливали делегат себя. – SwiftMatt

Смежные вопросы