2016-09-21 54 views
7

Wystąpił błąd podczas ustawiania delegowania UITextField.Gdzie ustawić metodę delegowania UiTextField w niestandardowym UiView

Mój kod to:

import UIKit 

class UserAlertVC: UIView , UITextFieldDelegate { 
/* 
// Only override draw() if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
override func draw(_ rect: CGRect) { 
    // Drawing code 
} 
*/ 

override init(frame: CGRect) { 
    super.init(frame: frame) 

} 

required init(coder aDecoder: NSCoder) { 

    super.init(coder: aDecoder)! 
    self.addBehavior() 

} 


func addBehavior(){ 
    print("Add all the behavior here") 
    userNameTxtField.delegate = self 
    passwordTxtField.delegate = self 

} 


func textFieldShouldReturn(textField: UITextField) -> Bool { 

    return true 
} 

func textFieldDidBeginEditing(textField: UITextField) { 

} 


@available(tvOS 10.0, *) 
func textFieldDidEndEditing(textField: UITextField, reason: UITextFieldDidEndEditingReason) { 

} 

@IBAction func actionOnCancel(sender: UIButton) { 
    self .removeFromSuperview() 


} 


@IBAction func actionOnProceed(sender: UIButton) { 
    self .removeFromSuperview() 
UserAlertVC.showAlertForUser() 


} 

@IBOutlet var userNameTxtField: UITextField! 

@IBOutlet var passwordTxtField: UITextField! 

static func showAlertForUser() { 

    let alert  = NSBundle.mainBundle().loadNibNamed("KeyboardViewController", owner: self, options: nil)!.last as! UIView 
    let windows  = UIApplication.sharedApplication().windows 
    let lastWindow = windows.last 
    alert.frame  = UIScreen.mainScreen().bounds 
    lastWindow?.addSubview(alert) 


} 
} 

Komunikat o błędzie jest:

fatal error: unexpectedly found nil while unwrapping an Optional value 

Użyłem alert niestandardowy View za pomocą XIB.pls zasugerować jakieś rozwiązanie.

+0

co to jest komunikat o błędzie? –

+0

Błąd krytyczny: nieoczekiwanie znaleziono zero podczas rozpakowywania wartości Opcjonalne – Gaurav

Odpowiedz

8

Najpierw spójrz na cykl życia widoku. W zależności od tego możliwe jest, aby podkreślić, że metody awakeFromNib jest całkiem odpowiednia, ponieważ:

The nib-loading infrastructure sends an awakeFromNib message to each object recreated from a nib archive, but only after all the objects in the archive have been loaded and initialized. When an object receives an awakeFromNib message, it is guaranteed to have all its outlet and action connections already established.

2

Upewnij się położyć @IBOutlet do Treści .Xib, także trzeba dodać kod stalówka. Na koniec upewnij się, że w swoim kontrolerze ViewController ustawiłeś UIView Outlet na UserAlertVC i dodasz metodę awakeFromNib. Załącz kod. Daj mi znać, jeśli potrzebujesz dalszej pomocy.

Oto kod związany z plikiem .xib.

import UIKit 

class UserAlertVC: UIView, UITextFieldDelegate { 

//MARK: - Outlets 

@IBOutlet var contentView: UIView! 
@IBOutlet var userNameTxtField: UITextField! 
@IBOutlet var passwordTxtField: UITextField! 

//MARK: - Loads 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    commonInit() 
} 

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
    commonInit() 
} 

//MARK: - Functions 

func commonInit() { 
    Bundle.main.loadNibNamed("UserAlertVC", owner: self, options: nil) 
    userNameTxtField.delegate = self 
    passwordTxtField.delegate = self 

    contentView.translatesAutoresizingMaskIntoConstraints = false 

    addSubview(contentView) 

    // add constraints programmatically 
} 

// add the rest of your code 

} 

Oto kod związany z ViewController.

class ViewController: UIViewController { 

//MARK: - Outlets 

@IBOutlet weak var userAlertVC: UserAlertVC! 

//MARK: - Loads 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func awakeFromNib() { 
    super.awakeFromNib() 
} 

}