gérer les date avec UIDatePicker
cdsoft
Membre
bonjour a tous,
je suis encore dans le brouillard avec les syntaxes swift.
je n arrive pas a récupérer la valeur du datepicker ni a lui en passer une, pour afficher directement une date voulue.
j imagine que cela vous parrait basic mais la doc ne semble pas claire du tout.
merci de votre aide
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
un passage ici UIDatePicker - UIKit | Apple Developer Documentation peut-être pour commencer, que tu peux compléter avec GG
merci pour le lien, mais justement il ne m a pas suffit pour y parvenir.
c est quoi GG?
GG c'est ça
::)
voici ce que je fais mais cela ne fonctionne pas, et ça plante:
voici ce que j ai:
2017-12-25 00:29:17.590547+0200 projet2[24708:2581131] -[projet2.secondViewController actiodate:]: unrecognized selector sent to instance 0x7fc4dad1a8b0
2017-12-25 00:29:17.610866+0200 projet2[24708:2581131] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[projet2.secondViewController actiodate:]: unrecognized selector sent to instance 0x7fc4dad1a8b0'
*** First throw call stack:
(
0 CoreFoundation 0x0000000106b7d1ab __exceptionPreprocess + 171
1 libobjc.A.dylib 0x0000000102db9f41 objc_exception_throw + 48
2 CoreFoundation 0x0000000106bfda34 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
3 UIKit 0x0000000103c4f761 -[UIResponder doesNotRecognizeSelector:] + 295
4 CoreFoundation 0x0000000106b000a8 ___forwarding___ + 1432
5 CoreFoundation 0x0000000106affa88 _CF_forwarding_prep_0 + 120
6 UIKit 0x0000000103a21275 -[UIApplication sendAction:to:from:forEvent:] + 83
7 UIKit 0x0000000103b9e4a2 -[UIControl sendAction:to:forEvent:] + 67
8 UIKit 0x0000000103b9e7bf -[UIControl _sendActionsForEvents:withEvent:] + 450
9 UIKit 0x0000000104540edc -[_UIDatePickerView pickerView:didSelectRow:inComponent:] + 568
10 UIKit 0x0000000103a03cc5 -[UIPickerView _sendSelectionChangedForComponent:notify:] + 104
11 UIKit 0x0000000103a03f11 -[UIPickerView _sendSelectionChangedFromTable:notify:] + 366
12 UIKit 0x000000010430fa88 -[UIPickerTableView _scrollingFinished] + 187
13 UIKit 0x000000010430fc78 -[UIPickerTableView scrollViewDidEndDecelerating:] + 30
14 UIKit 0x0000000103b209c8 -[UIScrollView(UIScrollViewInternal) _scrollViewDidEndDeceleratingForDelegate] + 179
15 UIKit 0x0000000103b1a827 -[UIScrollView(UIScrollViewInternal) _stopScrollDecelerationNotify:] + 321
16 UIKit 0x0000000103b1aa7b -[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:tramplingDragFlags:] + 502
17 UIKit 0x0000000103b10c99 -[UIScrollView _smoothScrollWithUpdateTime:] + 3134
18 UIKit 0x0000000103b10ecf -[UIScrollView _smoothScrollDisplayLink:] + 354
19 QuartzCore 0x0000000109fef818 _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 684
20 QuartzCore 0x000000010a12b970 _ZL22display_timer_callbackP12__CFMachPortPvlS1_ + 248
21 CoreFoundation 0x0000000106b0c9c9 __CFMachPortPerform + 169
22 CoreFoundation 0x0000000106b0c909 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
23 CoreFoundation 0x0000000106b0c871 __CFRunLoopDoSource1 + 465
24 CoreFoundation 0x0000000106b04654 __CFRunLoopRun + 2596
25 CoreFoundation 0x0000000106b039b9 CFRunLoopRunSpecific + 409
26 GraphicsServices 0x000000010929a9c6 GSEventRunModal + 62
27 UIKit 0x0000000103a1f5e8 UIApplicationMain + 159
28 projet2 0x00000001024972f7 main + 55
29 libdyld.dylib 0x0000000107c59d81 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
2. Tu n'as pas marqué la méthode actiodate comme @objc
3. Tu n'as pas utilisé la bonne syntaxe pour les selectors.
Ou, tu aurais pu connecté l'action vars la méthode en glissant entre le DatePicker et le code.
bonjour et merci Joanna,
je vais essayer pour la syntaxe.
mais je voudrais bien comprendre comment fait-on la difference entre ces differentes syntaxes qui ne sont pas compilees en erreur avant l execution.
existe t il une documentation qui regroupe de maniere precise les controles avec leur mise oeuvre programmee.
un peu comme sous windev ou la doc est vraiment bien faite.(ces encore mon modele de reference puisque je viens de cet environnement de dev)
et egalement, pourrais tu m expliquer ce que tu veux dire par :
merci encore
Tu n'as pas fait vraiment une erreur en utilisant le syntaxe Selector("nomDeMethode") parce que ça utilise l'init de la struct Selector.
Mais, si tu utilises Swift 4, tu aurais dû eu un avertissement qui te dit "Use '#selector' instead of explicitly constructing a 'Selector'" ; du coup le code que j'ai écrit.
Il faut lire les docs sous la rubrique "Selector Expressions" ici : https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/doc/uid/TP40014097-CH32-ID383
Les docs pour les controles sont bien comprehensives et se trouvent ici : https://developer.apple.com/documentation/uikit
Comment connecter un Action à ton code se trouve sous la rubrique "Define an Action to Perform" ici : https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/ConnectTheUIToCode.html
merci a toi
Une chose à savoir : les selectors sont des reliquats de l'Objective-C, le langage historique Apple. C'est pourquoi Xcode ajoute le symbole @objc devant ta fonction actiodate(). Swift a été conçu pour éviter autant que possible l'usage de code non vérifiable à la compilation (une grande spécialité de l'Objective-C).
Il est difficile de se passer complètement des Selectors, parce que la plupart des interactions composants graphiques/Code du framework UIKit les utilisent.
En général on ne les définit pas dans le code. Il est plus facile de créer un @IBAction avec Xcode pour " connecter graphiquement" un événement utilisateur avec une fonction.
ok
merci beaucoup pour ces precisions
j en profite encore vous demander s il est possible de faire l inverse en forcant l affichage d une date dans le datepicker
exemple:
le datepicker n affiche pas la date du jour mais se positionne sur une date particuliere, de maniere dynamique
Ou encore :
merci a tous
Vraiment ?
a
navré mais je reviens vers vous car j ai voulu tester vos code sur l événement datepicker et chez moi cela ne marche pas.
la syntaxe :
datetwo.addTarget(self, action: #selector(actiodate(_ ), for: .valueChanged)
me donne l erreur suivante :
Use of local variable 'actiodate' before its declaration
et quand je veux utiliser la création du @IBAction
@IBAction func actiodate(_ sender: UIDatePicker) {
labeltwo.text = dateValue.string(from: sender.date)
}
je n ai pas de erreur mais mon programme plante comme avant des que je change la date du contrôle datepicker
comme il s agit d un projet ou il y a tout et n importe quoi pour apprendre a manipuler swift je vous envoie tous le code de mon secondcontrolerview , qui comporte surtout des lignes commentées.
sachant que les reste du code avec les affichages des valeurs transmises fonctionnent. Le pb concerne le datepicker
merci
Je n'ai pas le temps de te répondre ce soir (je viens de boire ma coupe de champagne annuelle pour les fêtes, ce qui altère mes compétences éducatives). Je te fais un petit tuto demain, sur la manière de créer une IBAction avec Xcode. A mon avis, tu as juste recopié le code, sans réaliser la connexion graphique événement/fonction avec Xcode.
Une méthode (je dirais locale) a l'intérieur d'une fonction c'est pas possible ?
Si, les méthodes come ça est possible mais pas dans le cas d'une méthode que l'on veuille utiliser comme selector pour lier une Action.
Regardes le code pour la connecter :
La cible est "self" ; du coup, la méthode doit être membre de "self" ; sinon, le système Target/Action ne peut pas la trouver.
Juste quand je lisais ces lignes chez moi il refusait la func interne ?
merci je vais reessayer
@cdsoft
Petit exemple : J'ai écrit un mini-programme avec un storyboard ne contenant qu'une UIDatePicker.
Etape 1 : J'ai défini un outlet, tu sais le faire puisque tu l'utilises déjà dans ton programme
Etape 2 : Création d'une IBAction, c'est presque similaire à l'outlet.
- Je sélectionne l'UIDatePicker sur le Storyboard en pressant sur la touche " Ctrl " et je trace un lien vers le bas de la fenêtre de code.
Et, en refaisant ton code, il faut l'écrire plus clair :
Et il y a plus de fautes mais j'arrête maintenant
Xcode affiche alors une boite de dialogue pour connaà®tre le nom de la connection à créer.
- Il faut modifier le paramétre " Connection " pour signifier que c'est une Action.
- Lui donner un nom (actionDatePicker)
- Lui donner un type (UIDatePicker)
- Définir le type d'événement (Value Changed par défaut ce qui correspond à ton besoin actuel).
- Définir qu'il faut passer le Sender
Et valider en cliquant sur le bouton Connect.
EDIT : Grrr.. Nounours c'est pas bien de poster dans mon tuto ..
Xcode génère alors automatiquement une fonction pour gérer l'action :
Il ne reste plus qu'à ajouter du code pour gérer l'action. Par exemple :
Et c'est tout ..
encore merci a vous tous pour vos partages clairs et rapides.
je vais tester tout ca au plus vite en esperant vite me familiariser avec ce langage
a+