PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → [WM17] Sablier IOS
[WM17] Sablier IOS
Débuté par Yannick, 01 mar. 2012 22:20 - 32 réponses
Membre enregistré
4 messages
Posté le 01 mars 2012 - 22:20
Bonjour, j'ai implémenter les procédures Windev et Objective-C présentes dans l'exemple IOS Système.
Je veux utiliser le sablier dans mon projet mais celui-ci me fait planter l'application sur l'iphone.
Dans X-Code, le message d'erreur parle de "super dealloc".

En gros, je mais le sablier, je lance 4 petites requêtes, j'affiche les résultats et j'enlève le sablier.
L'application plante avant même l'affichage des résultats.

Quelqu'un aurait-il une petite idée de comment faire ou aurait-il une autre solution pour un sablier ?

D'avance merci.

Yannick
Posté le 03 juillet 2012 - 17:06
Bonjour,

Je viens actuellement de me pencher sur le sujet récemment et ait trouvé une solution. Si vous êtes toujours intéresser et bloquer. Faites un signe je vous monterais un petit tutoriel dessus.

Cdt.
Membre enregistré
203 messages
Popularité : +3 (3 votes)
Posté le 03 juillet 2012 - 17:58
Salut,

Le tuto m'intéresse, pourriez vous poster le lien ici svp?

Et éventuellement un exemple de code Windev?

Cordialement,

Alex
Membre enregistré
46 messages
Posté le 03 juillet 2012 - 18:16
Bonjour on peut faire plus simple je pense depuis l'avant dernière mise à jour,

sur clic d'un bouton ouvrant la nouvelle fenêtre (qui contiendra le sablier)
titresuivant("Chargement")
multitache(-1)
sablier(vrai)
ouvrefille(fen_mafenetre)

et dans fen_mafenetre mettre un sablier(faux)

bon dev.
Xavier ECOEUR
AT HOME Développement

--
Bon dev.
---
Xavier ECOEUR
AT HOME Développement
www.athome-dev.fr
Posté le 03 juillet 2012 - 20:17
Sure, il est possible de faire ça. Mais le sablier que met windev est tellement moche en plus de faire un faux effet grisé à la fenêtre.

Le mieux est à mon avis d'utiliser du code Objective-C c'est plus agréable et nous avons la main sur beaucoup de paramètres dessus.

Personnellement les premiers retour entre le Sablier(Vrai) / Sablier(Faux) et les fonction en obj-c de la part de mes testeurs, fait vraiment pencher la balance sur obj-c
Posté le 04 juillet 2012 - 12:34
Je pense d'ailleurs qu'il va en être de même pour les nombreuses fonctionnalités Xcode non disponibles dans Windev.

J'attends de mon coté un retour du ST concernant les évolutions prévues pour iOs, ce qui permettra clairement de se positionner par rapport au dév Obj C.

Sylvain
Membre enregistré
24 messages
Posté le 04 juillet 2012 - 12:57
Bonjour,

Je suis fortement intéressé par ton tuto Spek

Bonne journée
Posté le 05 juillet 2012 - 11:32
Pour le tuto, je le taperais d'ici samedi je pense.

Par contre pour les retour du support technique c'est toujours la même réponse "Nous en faisons part à notre équipe de développement".

Les gros points noirs que j'ai relevé et qui mérite correction / ajout sont pour moi :
- Pas de multi threads (et c'est compliqué de faire sans faut jongler entre les différents possibilité comme les champs html, le passage par de l'objective c,...)
- Pas de libération de mémoire sur certains champs (comme les fenêtre internes)
- Des erreur d'accès mémoire sur les champs HTML. (xCode retourne ERROR_BAD_ACCESS) et ça c'est le genre de chose qu'Apple refuse de publier.

Voila ce sont pour les 3 point prioritaires qui nous empêchent clairement de faire des applis en concurrence avec les applis déjà présent sur l'apple store.
Membre enregistré
24 messages
Posté le 10 juillet 2012 - 11:27
Salut Spek, as-tu eu le temps de faire le tuto pour le sablier ?
Membre enregistré
56 messages
Posté le 12 juillet 2012 - 22:57
Bonjour,

Désolé pour le temps, beaucoup de dev et peu de temps pour moi ;).

Donc voici comment j'ai procéder pour utiliser le sablier.

Attention il faut bien suivre l'ordre de dev, si vous voulez pas vous retaper tout dans xCode pour remettre dans l'ordre les procédure, les classes, implémentation et autre joyeuseté. Rappelez-vous que xCode (surtout Objective-C en fait) est très rigoureux.

J'ai pris pour ce tuto le sablier fait par windev que j'ai corrigé, pour des raisons claires de protection de code; et puis comme ça vous pourrez comparer avec ce qui est fait en exemple. Et puis surtout ça m'évite de me taper des commentaires. J'ai testé c'est fonctionnel.

Dans un premier temps créez une procédure globales que vous nommerez comme vous le voulez, je le nomme IOS. Cette procédure contiendra votre déclaration et implémentation du sablier, demain vous pourrez en rajouter d'autre. Supprimer tout ce qui se trouve dedans, et passez là en Obj-C (pour ceux qui ne savent pas suffit de cliquer sur WL à coté de du nom de la procédure dans la barre). Voici ce que vous mettrez dedans :
IOS

// Déclaration
void IOS(){}

// Imports et includes
#import <UIKit/UIKit.h> // Base UIKit
#import <QuartzCore/QuartzCore.h>// Base des animations QuartzCore

// Classes
@interface WDSablier : UIAlertView
{
// Indicateur d'activité
UIActivityIndicatorView *IndicateurActivite;
}
// Propriété pour accéder à l'indicateur
@Property (nonatomic, retain) UIActivityIndicatorView *IndicateurActivite;
- (void) Ferme;
@END

// Implémentations
@implementation WDSablier
@synthesize IndicateurActivite;
// Initialisation de la boîte d'affichage
-(id)initWithFrame:(CGRect)frame
{
IF ((self = [super initWithFrame:frame]))
{
// Crée l'indicateur
self.IndicateurActivite = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)];
// Ajoute l'indicateur à la boîte d'affichage
[self addSubview:IndicateurActivite];
// Style de l'indicateur
IndicateurActivite.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
// Anime l'indicateur
[IndicateurActivite startAnimating];
}
RETURN self;
}
-(void)Ferme
{
// Ferme la boîte de dialogue
[self dismissWithClickedButtonIndex:0 animated:Yes];
}
-(void)dealloc
{
// Libère
[IndicateurActivite release];
}
@END

// Variables globales
WDSablier* __SABLIER__ = nil;


Une fois cette procédure faîte, sauvegarder.

Maintenant, créer une nouvelle procédure en Objective-C (procéder comme avant) dans laquelle vous aller mettre :
void IOS_Sablier(BOOL bActif, NSString *sMessage)
{
// Si on demande l'activation du sablier
IF (bActif == Yes) {
// Si l'objet __SABLIER__ n'a pas encore été créé
IF (__SABLIER__ == nil) {
// Alloue un sablier avec le message spécifié
__SABLIER__ = [[[WDSablier alloc]
initWithTitle:@""
Message:sMessage
delegate:nil cancelButtonTitle:nil
otherButtonTitles:nil] autorelease];
}
// Affiche le sablier
[__SABLIER__ show];

// Si on demande la fin du sablier
} ELSE {
// Si l'objet __SABLIER__ est valide
IF (__SABLIER__ != nil) {
// Ferme le sablier
[__SABLIER__ Ferme];
// Libère le sablier
[__SABLIER__ release];
__SABLIER__ = nil;
}
}
}


Enfin il suffit de créer une procédure en WL langage (toujours en globale) dans laquelle vous allez mettre :
Procedure GestionLoading(Afficher = Vrai, TexteAffiche = "Veuillez patienter")

// La fonction n'est pas disponible en simulation
SI EnModeSimulateuriOS() ALORS RETOUR

// Appel natif
IOS_Sablier(Afficher, TexteAffiche)
Multitâche(-1)


Maintenant et pour terminer les appels :
Quand vous avez besoin d'appeler un chargement :
GestionLoading(Vrai,"Chargement en cours")


Puis après pour le terminer :
GestionLoading(Faux)


Quelques points importants :
- Si vous appeler le loading, terminer le derrière quand vous n'en avez plus besoin.
- Ne fermez pas une fenêtre sans avoir fermer le loading (vous risquez le bug de mémoire).

Et voilà vous avez un loading qui fonctionne sur un autre threads donc ne bloque votre code en cours avec un fond et une roue qui tourne et tout et tout. Enfin le système d'Apple.


Petit bonus, une procédure qui vous retourne l'id de l'appareil. Utile pour les licences.:
NSString* IOS_SysDeviceName()
{
// Renvoie l'identifiant unique de l'appareil
NSString* sysName = [[UIDevice currentDevice] uniqueIdentifier];
RETURN sysName;
}
Posté le 13 juillet 2012 - 11:34
Spek, Un grand merci pour ton code.

De mon côté j'ai un gros problème depuis plusieurs jours.

J'ai systématiquement des erreurs de compil.

Le message principal étant :

ld: file not found: /Volumes/DATA/Sylvain_New/Library/Developer/Xcode/DerivedData/IOS_TESTS-ddkkztfgxemupwecfunivuwuusbe/Build/Intermediates/IOS_TESTS.build/Debug-iphonesimulator/IOS_TESTS.build/Objects-normal/i386/WDObjectiveC.o

J'ai vérifié dans le répertoire et effectivement WDObjectiveC.o n'existe pas.

Je ne comprends pas ce qui se passe et ça me bloque complètement

ça te parle ?


Merci d'avance
Membre enregistré
56 messages
Posté le 13 juillet 2012 - 12:04
Non désolé, malheureusement je ne vois pas.

Sylvain a écrit dans le message de news <a15b2cffa779a176dd9f7124108d4a2d@news.pcsoft> :
Spek, Un grand merci pour ton code.

De mon côté j'ai un gros problème depuis plusieurs jours.

J'ai systématiquement des erreurs de compil.

Le message principal étant :

ld: file not found: /Volumes/DATA/Sylvain_New/Library/Developer/Xcode/DerivedData/IOS_TESTS-ddkkztfgxemupwecfunivuwuusbe/Build/Intermediates/IOS_TESTS.build/Debug-iphonesimulator/IOS_TESTS.build/Objects-normal/i386/WDObjectiveC.o

J'ai vérifié dans le répertoire et effectivement WDObjectiveC.o n'existe pas.

Je ne comprends pas ce qui se passe et ça me bloque complètement

ça te parle ?


Merci d'avance
Membre enregistré
46 messages
Posté le 18 septembre 2012 - 13:57
Bonjour, pour ma part cette fonction ne fonctionne pas sur mon xcode, elle me provoque des erreurs

Je pense avoir respecté les consignes.
Tant pis !

Bon Dev !
Xavier E.

--
Bon dev.
---
Xavier ECOEUR
AT HOME Développement
www.athome-dev.fr
Membre enregistré
141 messages
Posté le 18 septembre 2012 - 16:31
Quelles sont les erreur xCode ?
Car le forum m'a mis automatiquement en majuscule toute ce qui est condition tel que les "if" qui doivent être en miniscule par exemple.
Membre enregistré
46 messages
Posté le 18 septembre 2012 - 17:06
bonjour, serait il possible de vous avoir par téléphone ?
mon mail est : contact@athome-dev.fr

Merci !

--
Bon dev.
---
Xavier ECOEUR
AT HOME Développement
www.athome-dev.fr
Membre enregistré
141 messages
Posté le 26 septembre 2012 - 12:12
Malheureusement non, vous ne pouvez avoir mon téléphone.
Membre enregistré
46 messages
Posté le 26 septembre 2012 - 12:39
Bonjour, pouvez vous m'envoyer par email le code en fichier texte ? (je ne pense pas que le fichier texte modifie la casse)

Merci !
Bonne journée

--
Bon dev.
---
Xavier ECOEUR
AT HOME Développement
contact@athome-dev.fr
www.athome-dev.fr
Membre enregistré
141 messages
Posté le 26 septembre 2012 - 18:43
Aucun soucis pour un envoi mail.

Petit point là dessus tout de même avant,
J'utilise une variante de mon code pour gérer mon propre loading et en affiché plusieurs, ce code reste donc viable. Seulement, si vous veniez à ne vouloir qu'une boite de dialogue bleu (natif sous iOS) avec un texte personnalisable et une animation de chargement. Je ne saurais que vous conseillez d'utiliser la fonction Sablier avec la Fonction TitreSuivant qui ont été rendu compatible avec Windev Mobile pour iOS.

Ce code reste viable pour appréhender le fonctionnement des script Objective-C dans WM 17 et permet de le décliner pour créer une classe qui donnera un loading plus personnalisé.
Membre enregistré
46 messages
Posté le 26 septembre 2012 - 19:17
Bonjour, merci pour le mail, je souhaite "personnaliser" cette boite, le sablier bleu avec message est trop gros d'après moi.

Merci pour votre aide !
Bonne journée


--
Bon dev.
---
Xavier ECOEUR
AT HOME Développement
contact@athome-dev.fr
www.athome-dev.fr
Posté le 27 septembre 2012 - 14:06
Bonjour,

Serait il possible d'avoir le code par email ou en telechargement.

Merci.
Posté le 07 décembre 2012 - 23:58
Voici un code que j'utilise afin de 'libérer' des champs de la mémoire.
C'est une idée, je ne suis pas vraiment alaise dans xCode pour faire plus.
(Pas testé avec iOS 6)

void IOS_Dealloc(void* CurrentField)
{
[CurrentField release];
// CurrentField = nil; ne semble pas fonctionner correctement
// return 0;
}


Je l'appel comme ceci :
Procedure LibererChamps(sLeNomDuChamps = est une chaîne "")
SI EnModeSimulateur() ALORS
// Ou à votre guise
// EnModeSimulateuriOS()
// EnModeEmulateuriOS()

// On ne fait rien en mode simulateur
SINON
SI ChampExiste(sLeNomDuChamps) ALORS

// Un petit script affichant dans le log de xCode
IOS_TraceDebug("Champs à libérer "+sLeNomDuChamps)

// l'appel de notre fonction
IOS_Dealloc(Handle(sLeNomDuChamps))
FIN
FIN
Posté le 05 février 2013 - 11:27
Bonjour
Je suis également intéressé par le code de Spek34 par mail ou téléchargement.
En effet, j'ai moi aussi des erreurs de compilation dans XCode.

Grand merci.

Parallèlement, si vous avez une idée, je recherche le moyen d'afficher un sablier sur un champ en particulier.
Plus concrètement, lors du chargement d'une image, nous aimerions afficher un sablier dans ou sur le champ image lors du chargement.

Bon dev
Membre enregistré
141 messages
Posté le 05 février 2013 - 13:09
Bien entendu. Quel est ton mail et ton erreur.
Posté le 05 février 2013 - 14:13
Merci pour ta réponse Spek

Les erreurs (dans xCode) sont multiples, en voici 5.

1.
void IOS_Sablier(BOOL,NSSTRING*); <-- ! Unknown type name 'NSString'

2. (dans void IOS)
//Propriété pour accéder à l'indicateur
@Property (nonatomic,retain) UIActivityIndicatorView *IndicateurActivite;
- (void) Ferme; ! Expected an Objective-C directive after '@'
@END <-- ! Expected an Objective-C directive after '@'

3.
// Initialisation de la boîte d'affichage
-(id)initWithFrame:(CGRect)frame <-- Expected ';' after method prototype'

4.
//libère
[IndicateurActivite release];
}
@END <-- Expected an Objective-C directive after '@'

5.
//Si on demande l'activation du sablier
IF (bActif == Yes) <-- Use of undeclared identifier 'Yes'

...
...


dwi @ dagico . com

Bien à toi
Membre enregistré
141 messages
Posté le 05 février 2013 - 17:20
1.
void IOS_Sablier(BOOL,NSSTRING*); <-- ! Unknown type name 'NSString'

---> Est-ce que tu as bien #import <UIKit/UIKit.h> Au dessus ? Si oui pourrais je avoir ta déclaration complète.

2. (dans void IOS)
//Propriété pour accéder à l'indicateur
@Property (nonatomic,retain) UIActivityIndicatorView *IndicateurActivite;
- (void) Ferme; ! Expected an Objective-C directive after '@'
@END <-- ! Expected an Objective-C directive after '@'

Et oui le forum me troll un chouilla en mettant des majuscule c'est @end.

3.
// Initialisation de la boîte d'affichage
-(id)initWithFrame:(CGRect)frame <-- Expected ';' after method prototype'
avec la correction du dessus ça ira mieux. mettre @end a la place de @END partout xCode est sensible à la casse.

4.
//libère
[IndicateurActivite release];
}
@END <-- Expected an Objective-C directive after '@'

Pareil.

5.
//Si on demande l'activation du sablier
IF (bActif == Yes) <-- Use of undeclared identifier 'Yes'

if en minuscule et YES en majuscule. Je m'excuse je pensaisaps que le forum allait me changer toute mes majuscule au moment ou j'ai envoyé le message.

Si jamais ça marche préviens (ou pas nous discuterons par mail que je vois où cela peut bloquer et modifier mon code en conséquence).
Membre enregistré
11 messages
Posté le 05 février 2013 - 17:44
Merci pour ta réponse Spek
Oui import fait...

void IOS(){}

// Imports et includes
#import <UIKit/UIKit.h> // Base UIKit
#import <QuartzCore/QuartzCore.h> // Base des animations QuartzCore

Pour la casse ; j'essaye et je reviens vers toi...
Membre enregistré
141 messages
Posté le 06 février 2013 - 18:00
Non je te parlais de ta declaration complet de IOS_Sablier. En effet, le NSSTRING tout en majuscule comme ça, me parait bizarre. Aussi cela devrait être ecrit NSString * quelque chose.

De plus, qu'en est-il des problèmes de casse j'avoue que j'aimerais savoir ?
Posté le 16 août 2013 - 22:28
Bonjour!

J'ai la même erreur avec NSString....

Voici la déclaration de IOS_SAblier

void IOS_Sablier(bool bActif, NSString *sMessage)
{
// Si on demande l'activation du sablier
if (bActif == YES) {
// Si l'objet __SABLIER__ n'a pas encore été créé
if (__SABLIER__ == nil) {
// Alloue un sablier avec le message spécifié
__SABLIER__ = [[[WDSablier alloc]
initWithTitle:@""
Message:sMessage
delegate:nil cancelButtonTitle:nil
otherButtonTitles:nil] autorelease];
}
// Affiche le sablier
[__SABLIER__ show];

// Si on demande la fin du sablier
} else { // Si l'objet __SABLIER__ est valide
if (__SABLIER__ != nil) {
// Ferme le sablier
[__SABLIER__ Ferme];
// Libère le sablier
[__SABLIER__ release];
__SABLIER__ = nil;
}
}
}
Membre enregistré
141 messages
Posté le 19 août 2013 - 09:34
Bonjour,

Alors je viens juste de regarder ton code. Et je vois qu'il te manque ceci :
#include <UIKit/UIKit.h>

Merci de ton retour ;)
Posté le 25 novembre 2013 - 16:41
Bonjour,

j'ai corrigé pour que ça fonctionne...

ça vous intéeresse toujours ???

y a pas mal de pb de majuscule / minuscule...et puis une déclaration de variable globale aussi...

et le include à ajouter...

là faut mettre le include juste avant la déclaration de void IOS

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <UIKit/UIKit.h> // Base UIKit

void IOS(){}

// Imports et includes
#import <UIKit/UIKit.h> // Base UIKit
#import <QuartzCore/QuartzCore.h>// Base des animations QuartzCore

// Classes
@interface WDSablier : UIAlertView
{
// Indicateur d'activité
UIActivityIndicatorView *IndicateurActivite;
}
// Propriété pour accéder à l'indicateur
@property (nonatomic, retain) UIActivityIndicatorView *IndicateurActivite;
- (void) Ferme;
@end

// Implémentations
@implementation WDSablier
@synthesize IndicateurActivite;
// Initialisation de la boîte d'affichage
-(id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame]))
{

// Crée l'indicateur
self.IndicateurActivite = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)];
// Ajoute l'indicateur à la boîte d'affichage
[self addSubview:IndicateurActivite];
// Style de l'indicateur
IndicateurActivite.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
// Anime l'indicateur
[IndicateurActivite startAnimating];

//self.IndicateurActivite = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
//IndicateurActivite.center = CGPointMake(160, 200);
//IndicateurActivite.hidesWhenStopped = YES;
//[self addSubview:IndicateurActivite];
//[IndicateurActivite startAnimating];

}
return self;
}
-(void)Ferme
{
// Ferme la boîte de dialogue
[self dismissWithClickedButtonIndex:0 animated:YES];
}
-(void)dealloc
{
// Libère
[IndicateurActivite release];
}
@end

// Variables globales
WDSablier *__SABLIER__ = nil;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

là faut YES en majscule, if else end en minuscule , message en minuscule (pas Messsage).... etc...
////////////////////////////////////////////////////////////////

void IOS_Sablier(BOOL bActif, NSString *sMessage)
{
// Si on demande l'activation du sablier
if (bActif == YES) {
// Si l'objet __SABLIER__ n'a pas encore été créé
if (__SABLIER__ == nil) {
// Alloue un sablier avec le message spécifié
__SABLIER__ = [[[WDSablier alloc] initWithTitle:@"" message:sMessage delegate:nil cancelButtonTitle:nil otherButtonTitles:nil] autorelease];
}
// Affiche le sablier
[__SABLIER__ show];

// Si on demande la fin du sablier
} else {
// Si l'objet __SABLIER__ est valide
if (__SABLIER__ != nil) {
// Ferme le sablier
[__SABLIER__ Ferme];
// Libère le sablier
[__SABLIER__ release];
__SABLIER__ = nil;
}
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

au plaisir
Posté le 03 novembre 2014 - 16:38
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import <MediaPlayer/MediaPlayer.h>
void IOS(){}
//////////////////////////////////////////////////
// Classes
//////////////////////////////////////////////////

// Propriétés des toasts
#define FONT_SIZE 14
#define LEFT_RIGHT_PADDING 14
#define TOP_BOTTOM_PADDING 10
#define BOTTOM_MARGIN 200

#define BACKGROUND_COLOR darkGrayColor
#define FADE_IN_DURATION 0.4
#define FADE_OUT_DURATION 0.3
#define DELAY 2
#define MAX_CHAR_LINHA 30
#define MAX_LENGTH_LABEL 300
#define LEFT_RIGTH_BORDER 20
#define TOP_BOTTOM_BORDER 20

//#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
//#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
//#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
#define iOS7_0 @"7.0"


// Toast
@interface WDToast : NSObject
// Message
@property (nonatomic, strong) NSString *message;
// Durée
@property (nonatomic) int Delai;
// Champ libellé
@property (nonatomic, strong) UILabel *label;
// Crée un toast
+ (WDToast *)toastWithMessage:(NSString *)msg delay:(int)nDelai;
// Affiche le toast
- (void)showOnView:(UIView *)mainView;
@end

// Description de l'interface WDSaisie
@interface WDSaisie : UIViewController <UIAlertViewDelegate>
{
// Conserve la valeur saisie
NSString *ValeurSaisie;
// Conserve le bouton cliqué
NSInteger BoutonClicIdx;
// Bouton cliqué
BOOL m_bClic;
}
@property (nonatomic, retain) NSString *ValeurSaisie;
@property (nonatomic) NSInteger BoutonClicIdx;
// Affiche la boîte de saisie
-(void)Affiche:(NSString*)Question avecTexteAide:(NSString*)TexteAide avecFormatSaisie:(UIKeyboardType)FormatSaisie avecValeurDefaut:(NSString*)ValeurDefaut;
@end

// Description de l'interface WDSaisieMotDePasse
@interface WDSaisieMotDePasse : WDSaisie
{
// Conserve la valeur saisie
NSString *MotDePasse;
}
@property (nonatomic, retain) NSString *MotDePasse;
// Affiche la boîte de saisie
-(void)Affiche:(NSString*)Question avecTexteAide:(NSString*)TexteAide avecValeurDefaut:(NSString*)ValeurDefaut;
// Récupère la valeur saisie
@end

//////////////////////////////////////////////////
// Implémentations
//////////////////////////////////////////////////

// Implémentation de l'interface WDToast
@implementation WDToast
{
CGRect rect;
}


+ (WDToast *)toastWithMessage:(NSString *)msg delay:(int)nDelai;

{
WDToast *t = [[WDToast alloc] init];
t.message=msg;
t.Delai = nDelai;

//Resolucao
float xLabel;
float yLabel;
float wScreen;
float hScreen;
float hLablel;
float wLabel;
int countLines = 0;

CGSize sz = [UIScreen mainScreen].bounds.size;
wScreen = sz.width;
hScreen = sz.height;

UIFont *font = [UIFont systemFontOfSize:FONT_SIZE];

if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
// version < 7.0


CGSize withinSize = CGSizeMake(wScreen - LEFT_RIGTH_BORDER_EXTERN - LEFT_RIGTH_BORDER_INTERN, FLT_MAX);
CGSize size = [msg sizeWithFont:font constrainedToSize:withinSize lineBreakMode:NSLineBreakByWordWrapping];

wLabel = size.width + LEFT_RIGTH_BORDER_INTERN;
hLablel = size.height + TOP_BOTTOM_BORDER_INTERN;


} else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
// version >= 7.0

CGSize size2 = [msg boundingRectWithSize:CGSizeMake(wScreen - LEFT_RIGTH_BORDER_EXTERN - LEFT_RIGTH_BORDER_INTERN, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName : font
}
context:nil].size;


wLabel = size2.width + LEFT_RIGTH_BORDER_INTERN;
hLablel = size2.height + TOP_BOTTOM_BORDER_INTERN;
} else

{
countLines = (([msg length])/ MAX_CHAR_LINHA )+ 1;
if (countLines > 1 )
{

wLabel = MAX_LENGTH_LABEL;

}else
{

wLabel = ([msg length] * 8) + FONT_SIZE;

}
};


countLines = 30;
//Meio do iphone 3 e 4 = W: 160 e H: 240
xLabel = (wScreen / 2) - (wLabel / 2);
yLabel = (hScreen / 2);
//Desenha retangulo do Toast
CGRect rect = CGRectMake(xLabel,yLabel,wLabel,hLablel);
t.label = [[UILabel alloc] initWithFrame:rect];
t.label.text = msg;
t.label.textColor = [UIColor whiteColor];
t.label.font = [UIFont systemFontOfSize:FONT_SIZE];
//t.label.font = [UIFont fontWithName:@"Courier" size: FONT_SIZE];
t.label.textAlignment = NSTextAlignmentCenter;
t.label.backgroundColor = [UIColor BACKGROUND_COLOR];
t.label.numberOfLines = countLines;

return t;
}
- (void)showOnView:(UIView *)view
{
[self.label setAlpha:0];
[view addSubview:self.label];

[UIView animateWithDuration:FADE_IN_DURATION
animations:^{
[self.label setAlpha:1];
}
completion:^(BOOL finished) {
[UIView animateWithDuration:FADE_OUT_DURATION
delay:self.Delai
options:0
animations:^{ [self.label setAlpha:0]; }
completion:^(BOOL finished) {}
];
}];
}
@end

// Implémentation de l'interface WDSaisie
@implementation WDSaisie
@synthesize ValeurSaisie;
@synthesize BoutonClicIdx;
// Affiche(Question,TexteAide)
-(void)Affiche:(NSString*)Question avecTexteAide:(NSString*)TexteAide avecFormatSaisie:(UIKeyboardType)FormatSaisie avecValeurDefaut:(NSString*)ValeurDefaut
{
// Crée une boîte de dialogue avec les boutons OK et Annuler
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:Question delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Annuler",nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
// Récupère le champ de saisie
UITextField *alertTextField = [alert textFieldAtIndex:0];
// Définit le format de saisie
alertTextField.keyboardType = FormatSaisie;
// Définit le texte d'aide
alertTextField.placeholder = TexteAide;
// Définit la valeur par défaut
alertTextField.text = ValeurDefaut;
// Pas de clic
m_bClic = NO;
// Affiche la boîte de dialogue
[alert show];
// Boucle d'attente
do {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
} while (!m_bClic);
// Libère l'objet
[alert release];
}
// Délégué appelé lors de la validation de la boîte de saisie
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// Conserve la valeur saisie
ValeurSaisie = [[NSString alloc] initWithString:[[alertView textFieldAtIndex:0] text]];
// Conserve le bouton cliqué
BoutonClicIdx = buttonIndex;
// Clic
m_bClic = YES;
}
@end

// Implémentation de l'interface WDSaisieMotDePasse
@implementation WDSaisieMotDePasse
@synthesize MotDePasse;
// Affiche(Question,TexteAide)
-(void)Affiche:(NSString*)Question avecTexteAide:(NSString*)TexteAide avecValeurDefaut:(NSString*)ValeurDefaut
{
// Crée une boîte de dialogue avec les boutons OK et Annuler
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:Question delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Annuler",nil];
alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
// Récupère le champ de saisie
UITextField *alertTextField = [alert textFieldAtIndex:0];
// Définit le texte d'aide
alertTextField.placeholder = TexteAide;
// Définit la valeur par défaut
alertTextField.text = ValeurDefaut;
// Pas de clic
m_bClic = NO;
// Affiche la boîte de dialogue
[alert show];
// Boucle d'attente
do {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
} while (!m_bClic);
// Libère l'objet
[alert release];
}
// Délégué appelé lors de la validation de la boîte de saisie
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// Conserve la valeur saisie et le mot de passe
ValeurSaisie = [[NSString alloc] initWithString:[[alertView textFieldAtIndex:0] text]];
MotDePasse = [[NSString alloc] initWithString:[[alertView textFieldAtIndex:1] text]];
// Conserve le bouton cliqué
BoutonClicIdx = buttonIndex;
// Clic
m_bClic = YES;
}
@end
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
void IOS_SetAutolockDisabled(BOOL bStatus)
{
// Changes the status of the autolock
[[UIApplication sharedApplication] setIdleTimerDisabled:bStatus];
}
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
void IOS_ToastAffiche(NSString *sMessage, void *pclView, int nDelai)
{
WDToast *pclToast = [WDToast toastWithMessage:sMessage delay:nDelai];
[pclToast showOnView:(UIView *)pclView];
}
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
//Toast in iOS
Tempo is int = 0

IF Mensagem <> "" THEN

IF CurtoLongo = "C"
Tempo = 2
ELSE
Tempo = 5
END

IOS_ToastAffiche(Mensagem, Handle(), Tempo)// esta travando a aplicacao no ios

END
Posté le 03 novembre 2014 - 18:49
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AudioToolbox/AudioToolbox.h>

void IOS(){}
//////////////////////////////////////////////////
// Classes
//////////////////////////////////////////////////

// Propriétés des toasts
#define FONT_SIZE 14
#define LEFT_RIGHT_PADDING 14
#define TOP_BOTTOM_PADDING 10
#define BOTTOM_MARGIN 200

#define BACKGROUND_COLOR darkGrayColor
#define FADE_IN_DURATION 0.4
#define FADE_OUT_DURATION 0.3
#define DELAY 2
#define MAX_CHAR_LINHA 30
#define MAX_LENGTH_LABEL 300
#define LEFT_RIGTH_BORDER 20
#define TOP_BOTTOM_BORDER 20

//#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
//#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
//#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
#define iOS7_0 @"7.0"


// Toast
@interface WDToast : NSObject
// Message
@property (nonatomic, strong) NSString *message;
// Durée
@property (nonatomic) int Delai;
// Champ libellé
@property (nonatomic, strong) UILabel *label;
// Crée un toast
+ (WDToast *)toastWithMessage:(NSString *)msg delay:(int)nDelai;
// Affiche le toast
- (void)showOnView:(UIView *)mainView;
@end

// Description de l'interface WDSaisie
@interface WDSaisie : UIViewController <UIAlertViewDelegate>
{
// Conserve la valeur saisie
NSString *ValeurSaisie;
// Conserve le bouton cliqué
NSInteger BoutonClicIdx;
// Bouton cliqué
BOOL m_bClic;
}
@property (nonatomic, retain) NSString *ValeurSaisie;
@property (nonatomic) NSInteger BoutonClicIdx;
// Affiche la boîte de saisie
-(void)Affiche:(NSString*)Question avecTexteAide:(NSString*)TexteAide avecFormatSaisie:(UIKeyboardType)FormatSaisie avecValeurDefaut:(NSString*)ValeurDefaut;
@end

// Description de l'interface WDSaisieMotDePasse
@interface WDSaisieMotDePasse : WDSaisie
{
// Conserve la valeur saisie
NSString *MotDePasse;
}
@property (nonatomic, retain) NSString *MotDePasse;
// Affiche la boîte de saisie
-(void)Affiche:(NSString*)Question avecTexteAide:(NSString*)TexteAide avecValeurDefaut:(NSString*)ValeurDefaut;
// Récupère la valeur saisie
@end

//////////////////////////////////////////////////
// Implémentations
//////////////////////////////////////////////////

// Implémentation de l'interface WDToast
@implementation WDToast
{
CGRect rect;
}


+ (WDToast *)toastWithMessage:(NSString *)msg delay:(int)nDelai;

{
WDToast *t = [[WDToast alloc] init];
t.message=msg;
t.Delai = nDelai;

//Resolucao
float xLabel;
float yLabel;
float wScreen;
float hScreen;
float hLablel;
float wLabel;
int countLines = 0;

CGSize sz = [UIScreen mainScreen].bounds.size;
wScreen = sz.width;
hScreen = sz.height;

UIFont *font = [UIFont systemFontOfSize:FONT_SIZE];

if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
// version < 7.0


CGSize withinSize = CGSizeMake(wScreen - LEFT_RIGTH_BORDER_EXTERN - LEFT_RIGTH_BORDER_INTERN, FLT_MAX);
CGSize size = [msg sizeWithFont:font constrainedToSize:withinSize lineBreakMode:NSLineBreakByWordWrapping];

wLabel = size.width + LEFT_RIGTH_BORDER_INTERN;
hLablel = size.height + TOP_BOTTOM_BORDER_INTERN;


} else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
// version >= 7.0

CGSize size2 = [msg boundingRectWithSize:CGSizeMake(wScreen - LEFT_RIGTH_BORDER_EXTERN - LEFT_RIGTH_BORDER_INTERN, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName : font
}
context:nil].size;


wLabel = size2.width + LEFT_RIGTH_BORDER_INTERN;
hLablel = size2.height + TOP_BOTTOM_BORDER_INTERN;
} else

{
countLines = (([msg length])/ MAX_CHAR_LINHA )+ 1;
if (countLines > 1 )
{

wLabel = MAX_LENGTH_LABEL;

}else
{

wLabel = ([msg length] * 8) + FONT_SIZE;

}
};


countLines = 30;
//Meio do iphone 3 e 4 = W: 160 e H: 240
xLabel = (wScreen / 2) - (wLabel / 2);
yLabel = (hScreen / 2);
//Desenha retangulo do Toast
CGRect rect = CGRectMake(xLabel,yLabel,wLabel,hLablel);
t.label = [[UILabel alloc] initWithFrame:rect];
t.label.text = msg;
t.label.textColor = [UIColor whiteColor];
t.label.font = [UIFont systemFontOfSize:FONT_SIZE];
//t.label.font = [UIFont fontWithName:@"Courier" size: FONT_SIZE];
t.label.textAlignment = NSTextAlignmentCenter;
t.label.backgroundColor = [UIColor BACKGROUND_COLOR];
t.label.numberOfLines = countLines;

return t;
}
- (void)showOnView:(UIView *)view
{
[self.label setAlpha:0];
[view addSubview:self.label];

[UIView animateWithDuration:FADE_IN_DURATION
animations:^{
[self.label setAlpha:1];
}
completion:^(BOOL finished) {
[UIView animateWithDuration:FADE_OUT_DURATION
delay:self.Delai
options:0
animations:^{ [self.label setAlpha:0]; }
completion:^(BOOL finished) {}
];
}];
}
@end

// Implémentation de l'interface WDSaisie
@implementation WDSaisie
@synthesize ValeurSaisie;
@synthesize BoutonClicIdx;
// Affiche(Question,TexteAide)
-(void)Affiche:(NSString*)Question avecTexteAide:(NSString*)TexteAide avecFormatSaisie:(UIKeyboardType)FormatSaisie avecValeurDefaut:(NSString*)ValeurDefaut
{
// Crée une boîte de dialogue avec les boutons OK et Annuler
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:Question delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Annuler",nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
// Récupère le champ de saisie
UITextField *alertTextField = [alert textFieldAtIndex:0];
// Définit le format de saisie
alertTextField.keyboardType = FormatSaisie;
// Définit le texte d'aide
alertTextField.placeholder = TexteAide;
// Définit la valeur par défaut
alertTextField.text = ValeurDefaut;
// Pas de clic
m_bClic = NO;
// Affiche la boîte de dialogue
[alert show];
// Boucle d'attente
do {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
} while (!m_bClic);
// Libère l'objet
[alert release];
}
// Délégué appelé lors de la validation de la boîte de saisie
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// Conserve la valeur saisie
ValeurSaisie = [[NSString alloc] initWithString:[[alertView textFieldAtIndex:0] text]];
// Conserve le bouton cliqué
BoutonClicIdx = buttonIndex;
// Clic
m_bClic = YES;
}
@end

// Implémentation de l'interface WDSaisieMotDePasse
@implementation WDSaisieMotDePasse
@synthesize MotDePasse;
// Affiche(Question,TexteAide)
-(void)Affiche:(NSString*)Question avecTexteAide:(NSString*)TexteAide avecValeurDefaut:(NSString*)ValeurDefaut
{
// Crée une boîte de dialogue avec les boutons OK et Annuler
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:Question delegate:self cancelButtonTitle:@"OK" otherButtonTitles:@"Annuler",nil];
alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
// Récupère le champ de saisie
UITextField *alertTextField = [alert textFieldAtIndex:0];
// Définit le texte d'aide
alertTextField.placeholder = TexteAide;
// Définit la valeur par défaut
alertTextField.text = ValeurDefaut;
// Pas de clic
m_bClic = NO;
// Affiche la boîte de dialogue
[alert show];
// Boucle d'attente
do {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
} while (!m_bClic);
// Libère l'objet
[alert release];
}
// Délégué appelé lors de la validation de la boîte de saisie
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
// Conserve la valeur saisie et le mot de passe
ValeurSaisie = [[NSString alloc] initWithString:[[alertView textFieldAtIndex:0] text]];
MotDePasse = [[NSString alloc] initWithString:[[alertView textFieldAtIndex:1] text]];
// Conserve le bouton cliqué
BoutonClicIdx = buttonIndex;
// Clic
m_bClic = YES;
}

//Vibration - Treme Treme
//@interface VibrateViewController : UIViewController {
//}

@end
Posté le 29 novembre 2019 - 10:55
Bonjour à tous !

Sinon il ya plus simple dépuis la non ? je veux dire entre les solutions proposées en versions 17 et les dernieres versions ( 24 et 25 a ce jour) les fonctions Sablier et FenAttenteDébut font tres bien l'affaire non ?

Bon dev à tous !