2016-04-16 19 views
0

Ich habe den folgenden Code und die doneButton Handler wird nie aufgerufen. Irgendeine Idee, was könnte schief gehen?addTarget kein Ereignis ausgelöst

Ich habe viele verschiedene Formate für den Selektor ausprobiert, auch mit und ohne Parameter. Ich stellte auch sicher, dass die UIView Berührungsereignisse durch manuelle Einstellung userInteractionEnabled = true empfangen. Danke für jede Hilfe im Voraus!

*** UPDATE: Ich habe den Code komplett überarbeitet, aber gleiches Verhalten:

Mein Protokoll:

import Foundation 

protocol CustomDatePickerDelegate { 
    func dataPickerDone(date: NSDate) 
    func dataPickerChanged(date: NSDate) 
} 

meine Klasse:

import Foundation 
import UIKit 

class CustomDatePicker{ 

var delegate: CustomDatePickerDelegate? 
var datePicker : UIDatePicker = UIDatePicker() 

func CreateDatePicker(sender: UITextField) { 

    if (delegate is UIViewController) 
    { 
     let _self = delegate as! UIViewController 

     let _view = UIView(frame: CGRectMake(0, 0, _self.view.frame.width, 220)) 

     let datePickerView : UIDatePicker = UIDatePicker(frame: CGRectMake(0, 40, 0, 0)) 
     datePickerView.datePickerMode = UIDatePickerMode.Date 


     let _toolbar = UIToolbar() 
     let _doneButton = UIBarButtonItem(title: "DONE", style: UIBarButtonItemStyle.Done, target: self, action: #selector(CustomDatePicker.doneButton)) 
     _toolbar.translucent = false 
     _toolbar.sizeToFit() 

     _doneButton.accessibilityLabel = "DoneToolbar" 
     let _spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 


     _toolbar.setItems([_spaceButton, _doneButton], animated: false) 
     _toolbar.userInteractionEnabled = true 
        datePickerView.addTarget(self, action: #selector(CustomDatePicker.handleDatePicker), forControlEvents: UIControlEvents.ValueChanged) 

     _view.addSubview(datePickerView) 
     _view.addSubview(_toolbar) 

     sender.inputView = _view 
    } 
} 

@objc func handleDatePicker(sender:UIDatePicker) { 
    delegate?.dataPickerChanged(datePicker.date) 
} 

@objc func doneButton(){ 
    delegate?.dataPickerDone(datePicker.date) 
} 

}

Wie Ich benutze es vom ViewController:

let _dataPicker : CustomDatePicker = CustomDatePicker() 
    _dataPicker.delegate = self 
    _dataPicker.CreateDatePicker(dataUI) 

func dataPickerDone(date: NSDate) { 
    dataUI.text = DataFormatejada(date) 
    dataUI.resignFirstResponder() 
} 

func dataPickerChanged(date: NSDate) { 
    dataUI.text = DataFormatejada(date) 
} 
+0

Ich denke, dies kann ein Ergebnis des Hinzufügens der 'UIDatePicker' als Unteransicht zu dem' UITextField' sein. Auch wenn dies nicht das Problem ist, sollte es, sollte dies alles Ihre Klasse sein, wirklich keine UIView-Unterklasse sein, da es scheint, dass die Methode die Datumsauswahl zu einer anderen Ansicht hinzufügt, anstatt der Instanz von MyDatePicker Die Hierarchie? –

+0

hat mein Problem nicht gelöst, danke trotzdem! – Batiatto

+0

Hmm, ich nehme an, dass Ihre Datumsauswahl wie erwartet auf dem Bildschirm erscheint und Sie damit interagieren und das Datum ändern können? –

Antwort

0

Ich fand einen Weg, um das Problem nach vielen Stunden der Versuch-Fehler zu lösen. Das Problem ist, mit dem Ziel: Selbst Referenz in den Zeilen:

let _doneButton = UIBarButtonItem(title: "DONE", style: UIBarButtonItemStyle.Done, target: self, action: #selector(CustomDatePicker.doneButton)) 

und

_toolbar.userInteractionEnabled = true 
        datePickerView.addTarget(self, action: #selector(CustomDatePicker.handleDatePicker), forControlEvents: UIControlEvents.ValueChanged) 

so, was ich getan habe, ist eine neue Eigenschaft in MyDatePicker Klasse zu erstellen:

var instance : CustomDatePicker? 

ändern Sie diese addTarget-Methoden wie folgt:

let _doneButton = UIBarButtonItem(title: "DONE", style: UIBarButtonItemStyle.Done, target: instance, action: #selector(CustomDatePicker.doneButton)) 
_toolbar.userInteractionEnabled = true 
        datePickerView.addTarget(instance, action: #selector(CustomDatePicker.handleDatePicker), forControlEvents: UIControlEvents.ValueChanged) 

und ich benutze es aus dem Viewcontroller als:

let _dataPicker : CustomDatePicker = CustomDatePicker() 
    _dataPicker.delegate = self <---- **this made the trick** 
    _dataPicker.instance = _dataPicker 
    _dataPicker.CreateDatePicker(dataUI) 

aber das ist nicht elegant, und es ist ein Patch für eine grundlegende Frage. Warum liefert self die Instanz des Objekts nicht und ich muss es manuell zurückgeben, wenn ich das Objekt erstelle?

danke!

Verwandte Themen