12 berichten aan het bekijken - 1 tot 12 (van in totaal 12)
  • Q:
    Bijdrager
    JesseSar

    [Cocoa] WebViewProgressStartedNotification

    Hallo,

    ik ben een beetje aan het proberen met Cocoa en XCode, het is me al wel gelukt om een werkende simpele browser te maken, maar nu dit:

    ik wil dat als er een nieuwe pagina in de browser word geladen, dat er dan een method word aangeroepen. Ik wil dan namelijk in die method een voortgangsbalkje laten lopen etc.
    ik heb al wel gehoord van WebViewProgressStartedNotification, maar ik snap helemaal niks van die notifications.

    kan iemand mij op weg helpen?

    Bijdrager
    mhrenes

    Op weg helpen:

    Heb je het boek van Hillegass? [Cocoa Programming for Mac OS X (3rd edition)]
    Kijk dan even in het stukje over NSNotifications
    Kort samengevat, je kunt een bepaald object (bijvoorbeeld waarin je de gebruiker wilt informeren over de voortgang van het inladen) bij het NSNotificationCenter aanmelden.

    [code:1:fa990452fd][[NSNotificationCenter defaultCenter] addObserver:<jouw object> selector:@selector(mijnSelector:) name:@"belangrijkeNotificatie" object:<van object waarin je geinteresseerd bent>];[/code:1:fa990452fd]

    De WebView stuurt af en toe een NSNotification naar het NotificationCenter die dan alle geregistreerde objecten hiervan op de hoogte stelt (waaronder het jouwe)

    Niet vergeten om je ook weer af te melden

    [code:1:fa990452fd][NSNotificationCenter defaultCenter] removeObserver:<object>];[/code:1:fa990452fd]

    Als je het boek niet hebt zou ik het kopen…

    Inactief
    Anoniem

    Zoek eens in dit forum naar de gebruiker Studio Jeroen. Hij was ook bezig om Cocoa te leren door een eenvoudige browser te maken. Misschien dat daar nog wat meer tips voor je te vinden zijn. Maar zoals mhrenes ook al zei, een goed boek zoals die van Hillegass (3rd ed) is het geld meer dan waard. Succes!

    Bijdrager
    JesseSar

    @Mhrenes:

    als ik dus met mijn object notificaties van mijn webview genaamd “webview” wil krijgen, doe ik zoiets:

    [code:1:1ffb659930]
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(laadBalkjeLopen:) name:@"WebViewProgressStartedNotification" object:webview];
    [/code:1:1ffb659930]

    In ieder geval bedankt;)

    Edit: als ik doe wat ik hierboven zeg, werkt het niet. Ik ga het boek maar eens bekijken. Maar misschien weten jullie het:

    MainController.h:
    [code:1:1ffb659930]
    #import <Cocoa/Cocoa.h>


    @interface
    MainController : NSObject {
    IBOutlet id urlfield;
    IBOutlet id webview;
    }
    -(void)laadBalkjeLopen;
    @end
    [/code:1:1ffb659930]

    MainController.m:
    [code:1:1ffb659930]
    #import "MainController.h"

    @implementation MainController

    -(void)awakeFromNib {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(laadBalkjeLopen:) name:@"WebViewProgressStartedNotification" object:webview];
    }

    -(void)laadBalkjeLopen {
    // Code voor het laten lopen van het voortgangsbalkje
    }

    @end
    [/code:1:1ffb659930]

    Zo is het nu, weet iemand wat ik moet veranderen bij het NotificationCenter gebeuren om het wel te laten werken?

    Inactief
    Anoniem

    // Code voor het laten lopen van het voortgangsbalkje

    Misschien wil je dat ook posten, de rest ziet er op het eerste gezicht ok uit.

    Bijdrager
    JesseSar

    Ok, ik post die code later effe. Maar als ik daar een standaard code voor bijvoorbeeld een alert plaats komt er geen alert als ik een nieuwe pagina laad.

    MIjn code werkt dus niet. :?

    Bijdrager
    mhrenes

    Het probleem zit in:
    [code:1:1bc3a1399d]-(void) laadBalkjeLopen {
    // Code voor het laten lopen van het voortgangsbalkje
    } [/code:1:1bc3a1399d]

    Bij de aanmelding voor het NotificationCenter gebruik je:

    [code:1:1bc3a1399d] … selector:@selector(laadBalkjeLopen:) ….[/code:1:1bc3a1399d]

    Let op die : achteraan.

    Het notification center stuurt een object mee als de notification wordt verstuurd (een NSNotification). In feite wil die een method zien als:

    [code:1:1bc3a1399d]- (void) laadBalkjeLopen:(NSNotification *)meegestuurdeWebViewNotification
    {
    // Code …..
    }[/code:1:1bc3a1399d]

    Gelukkig checked hij tevoren of jouw object/code die method wel implementeert (doet hij nu dus niet) en roept hem dan ook niet aan want dan zou je programma crashen. In principe zou het moeten werken als je definitie van je method laadBalkjeLopen wijzigt zoals het laatste stukje code.

    Bijdrager
    JesseSar

    Oke, het werkt nog steeds niet :(.
    De bestanden zijn nu zo:

    MainController.h:

    [code:1:d5d39a0113]#import <Cocoa/Cocoa.h>


    @interface
    MainController : NSObject {
    IBOutlet id urlfield;
    IBOutlet id webview;
    }
    -(void)laadBalkjeLopen:(NSNotification *)meegestuurdeWebViewNotification;
    @end[/code:1:d5d39a0113]

    MainController.m:

    [code:1:d5d39a0113]#import "MainController.h"

    @implementation MainController

    -(void)awakeFromNib {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(laadBalkjeLopen) name:@"WebViewProgressStartedNotification" object:webview];
    }

    – (void)laadBalkjeLopen:(NSNotification *)meegestuurdeWebViewNotification {
    // Code voor het laten lopen van het balkje
    }

    @end[/code:1:d5d39a0113]

    Inactief
    Anoniem

    name:@”WebViewProgressStartedNotification”
    moet zijn
    name:WebViewProgressStartedNotification

    omdat WebViewProgressStartedNotification gewoon een NSString instance is, te vinden in WebView.h

    extern NSString *WebViewProgressStartedNotification;

    Bijdrager
    JesseSar

    Oke, het werkt nog steeds niet, hij laad de pagina nu zelfs helemaal niet meer.

    PS:
    MainController.m ziet er nu zo uit:

    [code:1:8e176c748d]#import "MainController.h"
    #import "WebKit/WebView.h"
    #import "WebKit/WebKit.h"

    @implementation MainController

    -(void)awakeFromNib {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(laadBalkjeLopen) name:WebViewProgressStartedNotification object:webview];
    }

    – (void)laadBalkjeLopen:(NSNotification *)meegestuurdeWebViewNotification {
    // Code
    }

    @end
    [/code:1:8e176c748d]

    Inactief
    Anoniem

    [code:1:3d02a2215b]
    @selector(laadBalkjeLopen:)
    [/code:1:3d02a2215b]

    Overigens, de voertaal in code is Engels, niet Nederlands

    Bijdrager
    JesseSar

    Ja dat weet ik, was alleen een beetje aan het experimenteren.:P

    Heel erg bedankt, dat werkt!

12 berichten aan het bekijken - 1 tot 12 (van in totaal 12)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.