PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV Mobile 2024 → [WM17] Sablier IOS
[WM17] Sablier IOS
Iniciado por Yannick, 01,mar. 2012 22:20 - 32 respuestas
Miembro registrado
4 mensajes
Publicado el 01,marzo 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
Publicado el 03,julio 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.
Miembro registrado
203 mensajes
Popularité : +3 (3 votes)
Publicado el 03,julio 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
Miembro registrado
46 mensajes
Publicado el 03,julio 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
Publicado el 03,julio 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
Publicado el 04,julio 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
Miembro registrado
24 mensajes
Publicado el 04,julio 2012 - 12:57
Bonjour,

Je suis fortement intéressé par ton tuto Spek

Bonne journée
Publicado el 05,julio 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.
Miembro registrado
24 mensajes
Publicado el 10,julio 2012 - 11:27
Salut Spek, as-tu eu le temps de faire le tuto pour le sablier ?
Miembro registrado
56 mensajes
Publicado el 12,julio 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;
}
Publicado el 13,julio 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
Miembro registrado
56 mensajes
Publicado el 13,julio 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
Miembro registrado
46 mensajes
Publicado el 18,septiembre 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
Miembro registrado
141 mensajes
Publicado el 18,septiembre 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.
Miembro registrado
46 mensajes
Publicado el 18,septiembre 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
Miembro registrado
141 mensajes
Publicado el 26,septiembre 2012 - 12:12
Malheureusement non, vous ne pouvez avoir mon téléphone.
Miembro registrado
46 mensajes
Publicado el 26,septiembre 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
Miembro registrado
141 mensajes
Publicado el 26,septiembre 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é.
Miembro registrado
46 mensajes
Publicado el 26,septiembre 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
Publicado el 27,septiembre 2012 - 14:06
Bonjour,

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

Merci.
Publicado el 07,diciembre 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
Publicado el 05,febrero 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
Miembro registrado
141 mensajes
Publicado el 05,febrero 2013 - 13:09
Bien entendu. Quel est ton mail et ton erreur.
Publicado el 05,febrero 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
Miembro registrado
141 mensajes
Publicado el 05,febrero 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).
Miembro registrado
11 mensajes
Publicado el 05,febrero 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...
Miembro registrado
141 mensajes
Publicado el 06,febrero 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 ?
Publicado el 16,agosto 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;
}
}
}
Miembro registrado
141 mensajes
Publicado el 19,agosto 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 ;)
Publicado el 25,noviembre 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
Publicado el 03,noviembre 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
Publicado el 03,noviembre 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
Publicado el 29,noviembre 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 !