2015-04-11 4 views
1

Я пытаюсь создать пользовательский делегат , который отправляет целочисленное значение в основной родительский класс ViewController. Я установил протокол и реализовал его в родительском классе. Необязательный код привязки всегда показывает необязательное значение. Почему это происходит, хотя я установил значение делегата из моего класса UIViewController?Почему пользовательский протокол делегата содержит необязательное значение - SWIFT

protocol SendMessage{ 

    func sendViewMessage(Int) 
} 

class BankLoginView: UIView,UITextFieldDelegate { 

    var delegate1 : SendMessage? 

    // var accountViewController:UIViewController=AccountLanding() 

    override init(frame: CGRect) { 

     super.init(frame: frame) 

    } 

    @IBAction func btnTickAction(sender: AnyObject) { 

     if let temp = self.delegate1 { 

      delegate1?.sendViewMessage(2) 

     }else{ 

      println("optional value contains nill value") 

     } 


    } 

} 

и я устанавливаю значение делегата в

class BankLogin: UIViewController ,SendMessage{ 


    override func viewDidLoad() { 
     super.viewDidLoad()    
     let rect: CGRect = CGRect (x: 0, y :10 , width: self.view.frame.size.width-50, height: self.view.frame.size.height-10) 
     var a = BankLoginView(frame : rect) 
     a.delegate1 = BankLogin() 

    } 

}

ответ

1

Что вы делаете, создавая новый вид класса BankLoginView

var a = BankLoginView(frame : rect) 

Делегат это будет новый экземпляр BankLogin:

a.delegate1 = BankLogin() 

Когда viewDidLoad() завершает работу var a, причина не сохраняется ни с каким объектом.

Возможно в раскадровке или СИБ файл, который вы выставиться класс представления о BankLogin как BankLoginView, но эта точка зрения не совпадает с той, который вы создали в этой строке:

var a = BankLoginView(frame : rect) 

Таким образом, делегат не назначается и печатает «факультативное значение содержит Нилл значение»

Declare BankLoginView в IBOutlet собственности:

@IBOutlet weak var bankLoginView: BankLoginView? (убедитесь, что мнение связано с файлом СИБ)

, а затем в viewDidLoad() делать:
bankLoginView.delegate1 = self; (вы можете сделать это в Interface Builder тоже)

+1

Да, я установил класс как BankLoginView в файле niib .. но также не работает .. что я должен делать? –

+1

где я объявляю BankLoginView как свойство IBOutlet :? –

+1

Здесь: класс BankLogin: UIViewController, SendMessage { @IBOutlet слабый var bankLoginView: BankLoginView? –

1

Пару вещей я заметил примыкают этот код.

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

@IBAction func btnTickAction(sender: AnyObject) { 

    if let actualDelegate = self.delegate1 { 
     actualDelegate.sendViewMessage(2) 

    }else{ 

     println("optional value contains nill value") 

    } 

Во-вторых вы посмотрите, как вы создаете новый экземпляр контроллера представления BankLogin и установив, что в качестве делегата.

class BankLogin: UIViewController ,SendMessage{ 


override func viewDidLoad() { 
    super.viewDidLoad()    
    let rect: CGRect = CGRect (x: 0, y :10 , width: self.view.frame.size.width-50, height: self.view.frame.size.height-10) 
    var a = BankLoginView(frame : rect) 

    //Do you want to create a new instance of Bank login here? 
    //a.delegate1 = BankLogin() 

    // Perhaps should be 
    a.delegate1 = self 


} 
+0

спасибо, но он не работает –

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