2017-09-29 6 views
0

J'ai créé un programme où le sélecteur s'affiche en cliquant sur mon champ de texte et j'essaie de le fermer lorsque je clique sur le bouton "Terminé" ou "Annuler" de ma barre d'outils.Erreur de réception lors d'une tentative de suppression du sélecteur

Je ne sais pas où ça s'est mal passé. Bien qu'il dise

"2017-09-28 20: 45: 27.877897-0600 projet1 [51296: 5112470] [LayoutConstraints] Impossible de satisfaire simultanément les contraintes."

Toutes mes contraintes fonctionnent très bien atm ..

Voici mon code:

@IBOutlet weak var textField1: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 


    let picker: UIPickerView 

    picker = UIPickerView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 300)) 
    picker.backgroundColor = .white 

    picker.showsSelectionIndicator = true 
    picker.delegate = self 
    picker.dataSource = self 

    let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 40)) 
    toolBar.barStyle = UIBarStyle.default 
    toolBar.isTranslucent = true 
    toolBar.tintColor = .black 

    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: 
     Selector(("donePicker"))) 
    let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) 
    let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: Selector(("donePicker"))) 
    ) 

    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: true) 
    toolBar.isUserInteractionEnabled = true 

    let bgView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 250 + toolBar.frame.size.height)) 
    print(picker.frame.size.height, toolBar.frame.size.height, bgView.frame.size.height) 


    bgView.addSubview(picker) 
    bgView.addSubview(toolBar) 
    textField1.inputView = bgView 
} 

func donePicker() { 
    textField1.resignFirstResponder() 
} 

Et ceci est l'erreur qu'il me donne:

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2017-09-28 20:45:29.253610-0600 project1[51296:5112470] [MC] Lazy loading NSBundle MobileCoreServices.framework 
2017-09-28 20:45:29.255001-0600 project1[51296:5112470] [MC] Loaded MobileCoreServices.framework 
2017-09-28 20:45:29.274235-0600 project1[51296:5112470] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /Users/Andrew/Library/Developer/CoreSimulator/Devices/EE44EDE5-BDF6-4A15-A44B-387E14685DAA/data/Containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles 
300.0 44.0 294.0 
2017-09-28 20:45:30.401748-0600 project1[51296:5112470] [MC] Reading from private effective user settings. 
2017-09-28 20:45:31.827410-0600 project1[51296:5112470] -[project1.CalculateViewController donePicker]: unrecognized selector sent to instance 0x7faac1d0fab0 
2017-09-28 20:45:31.835746-0600 project1[51296:5112470] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[project1.CalculateViewController donePicker]: unrecognized selector sent to instance 0x7faac1d0fab0' 
*** First throw call stack: 
(
    0 CoreFoundation      0x000000010c8a11cb __exceptionPreprocess + 171 
    1 libobjc.A.dylib      0x000000010a93cf41 objc_exception_throw + 48 
    2 CoreFoundation      0x000000010c921914 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132 
    3 UIKit        0x000000010d4660bd -[UIResponder doesNotRecognizeSelector:] + 295 
    4 CoreFoundation      0x000000010c824178 ___forwarding___ + 1432 
    5 CoreFoundation      0x000000010c823b58 _CF_forwarding_prep_0 + 120 
    6 UIKit        0x000000010d23f9bd -[UIApplication sendAction:to:from:forEvent:] + 83 
    7 UIKit        0x000000010dc3353f __45-[_UIButtonBarTargetAction _invoke:forEvent:]_block_invoke + 154 
    8 UIKit        0x000000010dc33470 -[_UIButtonBarTargetAction _invoke:forEvent:] + 181 
    9 UIKit        0x000000010d23f9bd -[UIApplication sendAction:to:from:forEvent:] + 83 
    10 UIKit        0x000000010d3b6183 -[UIControl sendAction:to:forEvent:] + 67 
    11 UIKit        0x000000010d3b64a0 -[UIControl _sendActionsForEvents:withEvent:] + 450 
    12 UIKit        0x000000010d3b53cd -[UIControl touchesEnded:withEvent:] + 618 
    13 UIKit        0x000000010d2b3d4f -[UIWindow _sendTouchesForEvent:] + 2807 
    14 UIKit        0x000000010d2b5472 -[UIWindow sendEvent:] + 4124 
    15 UIKit        0x000000010d25a802 -[UIApplication sendEvent:] + 352 
    16 UIKit        0x000000010db8ca50 __dispatchPreprocessedEventFromEventQueue + 2809 
    17 UIKit        0x000000010db8f5b7 __handleEventQueueInternal + 5957 
    18 CoreFoundation      0x000000010c8442b1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 
    19 CoreFoundation      0x000000010c8e3d31 __CFRunLoopDoSource0 + 81 
    20 CoreFoundation      0x000000010c828c19 __CFRunLoopDoSources0 + 185 
    21 CoreFoundation      0x000000010c8281ff __CFRunLoopRun + 1279 
    22 CoreFoundation      0x000000010c827a89 CFRunLoopRunSpecific + 409 
    23 GraphicsServices     0x00000001122ee9c6 GSEventRunModal + 62 
    24 UIKit        0x000000010d23dd30 UIApplicationMain + 159 
    25 UofA Engineering Master    0x0000000109ffa307 main + 55 
    26 libdyld.dylib      0x000000010fbc5d81 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

Répondre

0

J'ai essayé une approche différente pour montrer PickerView et toolbar dans textField.

Essayez ceci si cela aide dans votre scénario:

let toolBar = UIToolbar() 
toolBar.barStyle = UIBarStyle.default 
toolBar.isTranslucent = true 
toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
toolBar.sizeToFit() 

let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(CalculateViewController.donePicker)) 
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) 
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(CalculateViewController.cancelPicker)) 

toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
toolBar.isUserInteractionEnabled = true 

textField1.inputView = pickerView 
textField1.inputAccessoryView = toolBar 
0

Vous pouvez voir le message d'erreur est:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[project1.CalculateViewController donePicker]: unrecognized selector sent to instance 0x7faac1d0fab0' 

Pour Swift, nous ne définissons pas selector comme ça (il est objectif C chemin). Vous devez utiliser comme ceci:

let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: 
    #selector(donePicker)) 
0

puisque l'erreur est sélecteur non reconnu envoyé à l'instance, vous pouvez laisser le sélecteur devenir une propriété. remplacer le let picker: UIPickerView par la méthode viewdidload par var picker: UIPickerView?