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

    RootViewController is not key value coding-compliant

    Ik heb een RootViewController die een standaard een andere view (MainViewController) laad op deze manier :

    [code:1:bacb38caa0]MainViewController *viewController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
    self.mainViewController = viewController;[/code:1:bacb38caa0]

    En in de xib die de MainViewController laad heb ik een IBOutlet naar bijvoorbeeld een ActivityIndicatorView en een Label.:)

    Als ik dan mijn App Build & Run krijg ik de volgende exception voor mijn kiezen :

    [code:1:bacb38caa0]’NSUnknownKeyException’, reason: ‘[<RootViewController 0x44e660> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key loadIndicator.'[/code:1:bacb38caa0]

    En dan houd het op..

    Weet niet zeker of het er mee te maken heeft, maar ik heb al een @property en @synthesize gedefineerd voor de beiden properties.

    Ben nog niet helemaal bedreven in Objective-C en Cocoa, en snap het Key-Value binding ook nog niet helemaal. Kan iemand mij in de goede richting sturen?:)

    Bijdrager
    TGV

    Voor KVC heb je alleen maar twee methoden nodig om variable “x” te exporteren, namelijk
    – (id)x;
    – (void)setX:(id)newValue;

    Je mag voor id overigens ook een “echt” type kiezen. En de “set” hoeft niet per se geïmplementeerd te worden. Voor jou zou het dan worden:

    – (id)loadIndicator;
    – (void)setLoadIndicator:(id)newValue;

    (let op de hoofdletter na set). Overigens betekent dit niet dat het meteen gaat werken, want als je nog meer variabelen gebonden hebt, krijg je pas als je dit probleem hebt opgelost de volgende foutmelding voor je kiezen.

    Bijdrager
    webmaniac

    En in de xib die de MainViewController laad heb ik een IBOutlet naar bijvoorbeeld een ActivityIndicatorView en een Label.

    Maar de exceptie treed op bij de class RootViewController. Het lijkt er op dat je de load indicator op een of andere manier aan een niet bestaande outlet van RootViewController verbind (die had je namelijk in MainViewController gedefinieerd aldus bovenstaande quote).

    Kijk of alle connecties in IB goed staan.

    Bijdrager
    danielpunt

    De File’s Owner van MainView.xib is MainViewController, en alle actions gaan wel goed.:) Dus ik neem aan dat alles wel goed zit.

    @TGV Dat moet ik doen in mijn MainViewController of de RootViewController? Ik dacht overigens dat die getters en setters niet meer nodig waren met @property en @synthesize.:)

    Bijdrager
    webmaniac
    ”danielpunt”

    De File’s Owner van MainView.xib is MainViewController, en alle actions gaan wel goed.:) Dus ik neem aan dat alles wel goed zit.

    Ik heb het probleem ook als eens gehad. Ik had een IBOutlet hernoemd in de controller source en opnieuw verbonden in Interface Builder. Toch crashte mijn app met de zelfde foutmelding als jij nu krijgt. Dit kwam omdat de oude connectie ook nog bestond.

    Deze werd zichtbaar door met een rechter muis klik (ctrl-click) op de controller. (In jou geval MainViewController, aangezien de error hier optreed). In het transparante zwarte venster zag ik vervolgens de connectie in geel (warning) weergegeven.

    Bijdrager
    danielpunt

    In het transparant zwarte venster zie ik geen waarschuwingen. Ook niet in het info palet.:)

    Overigens voeg ik de view op deze manier toe :
    [code:1:59dcc90746]- (void)viewDidLoad
    {
    [self loadMainViewController];
    [self.view addSubview:mainViewController.view];
    }[/code:1:59dcc90746]

    Dit is in de RootViewController dus.:)

    Bijdrager
    webmaniac
    ”danielpunt”

    In het transparant zwarte venster zie ik geen waarschuwingen. Ook niet in het info palet.:)

    Overigens voeg ik de view op deze manier toe :
    [code:1:74cf6a8fdb]- (void)viewDidLoad
    {
    [self loadMainViewController];
    [self.view addSubview:mainViewController.view];
    }[/code:1:74cf6a8fdb]

    Dit is in de RootViewController dus.:)

    Maar als ik je goed begrijp heb je de outlet loadIndicator in MainViewController gedefinieerd. Terwijl de error:
    [code:1:74cf6a8fdb]’NSUnknownKeyException’, reason: ‘[<RootViewController 0x44e660> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key loadIndicator.'[/code:1:74cf6a8fdb]
    aangeeft dat de kvc methode setValue voor loadIndicator op RootViewController wordt uitgevoerd, en die bestaat dus niet. Er is dus nog een connectie tussen de loadIndicator en RootViewController die er niet zou moeten zijn

    Bijdrager
    danielpunt

    Klopt, die IBOutlet staat in mijn MainViewController. Maar ik heb nergens een directe outlet van de RootViewController naar de loadIndicator. De enige verbinding die de 2 hebben is via de MainViewController die standaard geladen word met het stukje code die ik in de post hier boven gaf.

    Dus ik vermoed dat die niet helemaal in orde is. Ik zal even een versimpelde versie van mijn applicatie schrijven als dat helpt.:)

    Bijdrager
    TGV

    Ik raad je aan de Key-Value binding tutorial te doen. Dat verduidelijkt een hoop. Voor bindings heb je geen outlets nodig: de binding zelf geeft aan van welk object hij data ophaalt.

    Bijdrager
    danielpunt

    Dat lijkt me een heel goed idee.:) Ik ga even lezen.

    Bijdrager
    webmaniac
    ”TGV”

    Ik raad je aan de Key-Value binding tutorial te doen. Dat verduidelijkt een hoop. Voor bindings heb je geen outlets nodig: de binding zelf geeft aan van welk object hij data ophaalt.

    In dit geval is het anderom. Omdat er outlets gebruikt worden, wordt de KVC methode setValue:forKey: gebruikt. Dit heeft niets te maken met bindings. Deze methode wordt tijdens het laden van de nib gebruikt om de waarde van de IBOutlet loadIndicator te ‘verbinden’ met de juiste control die in Interface Builder verbonden is met de outlet loadIndicator. Ofwel de Apple code die de nib laad voert de methode setValue:forKey: uit op een object met als value de NSView subclass en als key “loadIndicator”

    Bijdrager
    danielpunt

    Hm, het word niet echt duidelijker voor mij. Ook niet na het lezen van dit artikel. Misschien ligt het aan mij, misschien aan het feit dat het bijna weekend is.

    Overigens is het een UIView subclass.:)

    Bijdrager
    TGV

    Die tutorial is wat ingewikkeld: hij gaat over dubbele relaties en arrays en zo. Misschien moet je beginnen met die simpele die bij XCode zit.

    Maar het idee is als volgt:
    – je hebt in je interface een control
    – die bind je aan een object. FileOwner is het object dat de nib/xib “ownt”, maar je kunt ook andere objecten uit de nib gebruiken.
    – dan kies je de manier van benaderen. Om aan een variabele te komen laat je het controllerpad leeg (die heb je alleen nodig als je aan een controller bindt, geloof ik) en vul je de naam van de variabele in. Die variabele moet dan wel een type hebben dat je control begrijpt. NSString voor een NSTextField, bv.
    – Neem twee methoden op (zoals eerder beschreven) met het type van je variabele, bv “myVar” en “setMyVar”.
    – Als het veld geüpdated moet worden, roept de interface voor het object dat bij de nib hoort, de functie [obj myVar] aan om aan de waarde te komen; als je iets in de control verandert, roept de interface [obj setMyVar:newValue] aan.

    Het heeft dus niets met outlets te maken. Dat is een manier om objecten die bij het inlezen van de nib (bv tijdens het maken van een nieuw document) gemaakt worden aan elkaar te linken via member variables.

    Bijdrager
    danielpunt

    Oké, na een tijdje is het toch eindelijk tot mij door gedrongen.:)
    Alles werkt nu zo als het zou moeten.

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

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