2015-09-25 5 views
-1

Привет У меня есть 2 классов:Swift делегация без раскадровки

первый класс является отправитель, который наследует от UIViewController:

class Sender: UIViewController { 

// ReceiverDelegate property for communicating with viewmodel // 
var delegate: ReceiverDelegate? 

// loginButtonClicked - IBAction called after login button clicked // 
@IBAction func loginButtonClicked(sender: AnyObject) { 
    delegate?.didPressLoginWithCredentials("xx", password: "ss") 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    Receiver(vc: self) 
    // Do any additional setup after loading the view, typically from a nib. 
} 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

второго класса только приемник класса, как модель и ее не является UIViewController:

protocol ReceiverDelegate { 
func didPressLoginWithCredentials(username: String, password: String) 
} 


class Receiver: ReceiverDelegate { 
init(vc: Sender) { 
    vc.delegate = self 
} 

func didPressLoginWithCredentials(username: String, password: String) { 
    println("THE MESSAGE") 
} 

} 

Я хотел спросить, хорошо ли это oach для назначения делегата. Мне нужно как-то сделать это в моем отправителе, потому что приемник никогда не будет инициализирован?

Я назначил своего делегата в viewDidLoad отправителя.

Если есть лучший подход, пожалуйста, помогите! (Возможно, я должен просто делать что-то вроде вар приемник = приемник(), а затем просто вызывать методы приемника без делегирования?)

ответ

1

Это должно быть больше, как это:

class Sender: UIViewController, ReceiverDelegate { 

var receiver: Receiver() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    receiver.delegate = self 
} 

func didPressLoginWithCredentials(username: String, password: String) { 
    println("THE MESSAGE") 
} 

Затем в приемнике:

protocol ReceiverDelegate { 
    func didPressLoginWithCredentials(username: String, password: String) 
} 

class Receiver: NSObject { //or whatever you're subclassing 

    weak var delegate: ReceiverDelegate? 

    init(vc: Sender) { 
     // your initialization code 
    } 

    // loginButtonClicked - IBAction called after login button clicked 
    @IBAction func loginButtonClicked(sender: AnyObject) { 
     delegate?.didPressLoginWithCredentials("xx", password: "ss") 
    } 
} 

Стоит отметить, что ваш код немного запутанный - я не уверен, что ваш приемник должен быть, но я перестроил ваш код, чтобы правильно использовать протоколы/делегирование. Получателю понадобится эта кнопка входа в систему, поэтому, возможно, это подкласс UIView. Трудно сказать, не видя больше.

Код, приведенный выше, является тем, что вы бы сделали, если у вас есть дочерний вид с кнопкой в ​​нем, и вы хотите, чтобы контроллер представления обрабатывал действие.

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