ScreenSaverView - Comportement bizarre

03:26 modifié dans API AppKit #1
Bonsoir,

J'ai eu la petite idée de faire un screen saver qui permettrait de lire un fichier swf (animation flash). Le plus simple étant d'inclure une webView..
Le problème est que lors de la preview (via les préférences d'économiseurs d'écran), j'arrive à  lire l'animation (même quand je clique sur le bouton "tester"). Mais quand je laisse mon ordinateur jusqu'à  la marche de l'économiseur ou bien que je vais sur un coin de mon écran pour l'activer, l'animation n'est pas lue...

<br />- (void)startAnimation<br />{<br />	webView = [[[WebView alloc] initWithFrame:[self frame] frameName:@&quot;webView&quot; groupName:nil] retain];<br />	[self replaceSubview:view with:webView];<br /><br />	[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[prefsC fileURL]]];<br />	<br />	[super startAnimation];<br />}<br />


(PrefsC = PreferencesController (NSWindowController))

Apparemment le problème ne vient pas du code. Il est peut-être mal placé mais la récupération de l'URL est correcte étant donné qu'il arrive à  le lire en preview.

Réponses

  • ChachaChacha Membre
    03:26 modifié #2
    Salut,

    J'ai essayé de faire excatement la même chose que toi http://www.objective-cocoa.org/forum/index.php?topic=1889.0 mais moi je n'y connais rien en flash.
    Tu fais comment pour charger l'animation dans une WebView ?

    +
    Chacha
  • BruBru Membre
    03:26 modifié #3
    Peux-tu expliquer cette ligne :
    [tt][self replaceSubview:view with:webView];[/tt]
    A quoi correspond le NSView view ?

    .
  • 03:26 modifié #4
    Le NSView est une view initialisé dès le début (complétement vide). à‰tant donné que la méthode "addSuview:" ajoute à  chaque fois une vue, j'ai préféré utiliser une view bidon pour remplacer.

    @Chacha : pour charger l'animation dans une webView, t'as le code juste au dessus.
    <br />[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[prefsC fileURL]]];<br />
    

    [prefsC fileURL] retourne évidemment une NSURL initialisé de la sorte :
    <br />return [NSURL fileURLWithPath:@&quot;LeCheminDuFichierSWF.swf&quot;];<br />
    
  • BruBru Membre
    03:26 modifié #5
    Quoiqu'il en soit, ta façon de faire est bizarre...

    Moi, je fais comme ça (et ça marche) :
    <br />- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview<br />{<br />&nbsp; &nbsp; if (self=[super initWithFrame:frame isPreview:isPreview])<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; [self setAnimationTimeInterval:10];<br />&nbsp; &nbsp; &nbsp; &nbsp; webview=[[WebView alloc] initWithFrame:[self frame]];<br />&nbsp; &nbsp; &nbsp; &nbsp; [self addSubview:webview];<br />&nbsp; &nbsp; &nbsp; &nbsp; [webview release];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br />- (void)startAnimation<br />{<br />&nbsp; &nbsp; [super startAnimation];<br />&nbsp; &nbsp; [[webview mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@&quot;http://dernier-exile.com/header.swf&quot;]]];<br />}<br />
    


    .
  • 03:26 modifié #6
    Bizarrement, ça ne marche pas.
    Si je me place dans un coin de l'écran pour activer l'économiseur, ça ne charge rien du tout
  • BruBru Membre
    03:26 modifié #7
    Il nous faudrait le code complet (enfin les classes ScreenSaverView) que tu implémentes, car là  je sèche.
    A tout hasard, je te joins mon projet de test pour que tu vois chez toi !

    .

    [Fichier joint supprimé par l'administrateur]
  • 03:26 modifié #8
    Okay, le projet est joint ci-dessous..
    Normalement il y a un fichier "lol.swf" par défaut mais je l'ai viré car ça alourdi le ZIP.
    Donc il ne faudra pas tenir compte de la key "default" de NSUserDefaults.


    [Fichier joint supprimé par l'administrateur]
  • BruBru Membre
    03:26 modifié #9
    Tu ne respectes pas vraiment les consignes d'Apple concernant la création d'un screen-saver :
    - ta gestion des préférences est inadaptée.
    - la présence d'un windowContrôleur pour gérer les prefs est assez lourde.

    Je te renvoie ton projet corrigé selon les guidelines Apples.
    A tester !

    .

    [Fichier joint supprimé par l'administrateur]
  • ChachaChacha Membre
    03:26 modifié #10
    @Chacha : pour charger l'animation dans une webView, t'as le code juste au dessus.
    <br />[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[prefsC fileURL]]];<br />
    

    Non non, moi je parlais du code HTML qui embarque le flash... Il faut mettre quoi au juste ?

    +
    Chacha
  • septembre 2006 modifié #11
    dans 1157715201:

    @Chacha : pour charger l'animation dans une webView, t'as le code juste au dessus.
    <br />[[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:[prefsC fileURL]]];<br />
    

    Non non, moi je parlais du code HTML qui embarque le flash... Il faut mettre quoi au juste ?

    +
    Chacha


    <br />&lt;body&gt;<br />&lt;center&gt;&lt;embed src=&quot;lien.swf&quot;&gt;&lt;/embed&lt;/center&gt;<br />&lt;/body&gt;<br />
    

    Merci bru, en fait c'est mon premier screen saver et j'ai pas regardé la doc Apple j'ai fait avec mes connaissances
  • 03:26 modifié #12
    Petit problème, la fenêtre des préférences ne s'affiche pas et lors de la preview via les préférences d'économiseurs d'écran, la webview se place dans le coin haut/droit
  • BruBru Membre
    03:26 modifié #13
    dans 1157743131:

    Petit problème, la fenêtre des préférences ne s'affiche pas et lors de la preview via les préférences d'économiseurs d'écran, la webview se place dans le coin haut/droit


    La webview en haut à  droite ?
    C'est juste une erreur de gros débutant que je suis !
    Remplace dans initWithFrame:isPreview: :
    [tt]webview=WebView alloc] initWithFrame:[self frame;[/tt] par
    [tt]webview=WebView alloc] initWithFrame:[self bounds;[/tt]

    Quant à  la fenêtre des préférences : vérifie les connexions dans le nib. La fenêtre doit être connectée à  l'outlet configureSheet. D'autre part, par quelques NSLog, vérifie que loadNibNamed:owner dans la méthode configureSheet renvoie bien un NSWindow...

    .
  • 03:26 modifié #14
    Ok merci bru 
  • 03:26 modifié #15
    Bon je pense que pour la fenêtre des préférences, tu as du te planter quelque part :
    <br />- (NSWindow*)configureSheet<br />{<br />	ScreenSaverDefaults *userDefaults;<br /><br />	// si le nib n&#39;a pas déjà  été chargé, alors on le charge<br />	if (!configureSheet) [NSBundle loadNibNamed:@&quot;Preferences&quot; owner:self];<br />	<br /><br />	// le nib est chargé : on peut initiliser les contrôles<br />	if (configureSheet)<br />	{<br />		// lecture des paramètres pour alimentation du panneau de préférence<br />		userDefaults=[ScreenSaverDefaults defaultsForModuleWithName:[[NSBundle bundleForClass:[self class]] bundleIdentifier]];<br />		[field setStringValue:[userDefaults objectForKey:@&quot;swf&quot;]];<br />	}<br />	return configureSheet;<br />}
    


    je ne vois pas où tu charges "configureSheet".
  • BruBru Membre
    03:26 modifié #16
    La fenêtre "configureSheet" est dans le nib Preferences.nib.
    Ce nib est chargé en mémoire par [NSBundle loadNibNamed:@Preferences owner:self], ce qui charge la fenêtre. Le owner est l'objet screen-saver lui même, ce qui permet de connecter les IBOutlet et IBAction du .h aux objets du nib.

    Note que chez moi, la fenêtre s'affiche correctement.

    .
  • 03:26 modifié #17
    J'en apprend des choses ! 
  • 03:26 modifié #18
    Allez j'ai trouvé :


    iLou:~ Loulou$ /Applications/System\ Preferences.app/
    -bash: /Applications/System Preferences.app/: is a directory
    iLou:~ Loulou$ /Applications/System\ Preferences.app/Contents/MacOS/System\ Preferences
    2006-09-09 14:31:56.777 System Preferences[1302] *** Assertion failure in -[NSTextFieldCell _objectValue:forString:errorDescription:], AppKit.subproj/NSCell.m:1298
    2006-09-09 14:31:56.789 System Preferences[1302] Invalid parameter not satisfying: aString != nil
    iLou:~ Loulou$

    Problème réglé :D
  • 03:26 modifié #19
    Bon apparemment le problème persiste...
    La bonne animation est chargée lorsque je fais une preview ou que je clique sur "tester", mais lorsque je l'active via un coin de l'écran, il me charge l'animation par défaut..

    <br />- (void)startAnimation<br />{<br />	ScreenSaverDefaults *userDefaults;<br /><br />	userDefaults=[ScreenSaverDefaults defaultsForModuleWithName:[[NSBundle bundleForClass:[self class]] bundleIdentifier]];<br /><br />	if([userDefaults boolForKey:@&quot;default&quot;]||![userDefaults objectForKey:@&quot;swf&quot;])<br />		[[webview mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle bundleForClass:[self class]] pathForResource:@&quot;lol&quot; ofType:@&quot;swf&quot;]]]];<br />	else<br />		[[webview mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[userDefaults objectForKey:@&quot;swf&quot;]]]];<br /><br />	[super startAnimation];<br />}<br />
    
Connectez-vous ou Inscrivez-vous pour répondre.