Gå til innhold

Objective-C: Use of undeclared identifier


Anbefalte innlegg

Heisann!

 

Holder på å programmere med objective-C og har et lite problem.

Skal vise bilde i celler. Men når jeg har gjort det og skal teste appen får jeg opp:

 

Desktop/CollectionDemo/CollectionDemo/MyCollectionViewCell.m:25:13: Use of undeclared identifier 'IconImages'

i MyCollectionViewCell.m:

 

#import "MyCollectionViewCell.h"

@implementation MyCollectionViewCell

#pragma mark -

#pragma mark UICollectionViewDataSource

-(NSInteger)numberOfSectionsInCollectionView:

(UICollectionView *)collectionView

{

return 1;

}

-(NSInteger)collectionView:(UICollectionView *)collectionView

numberOfItemsInSection:(NSInteger)section

{

return *IconImages.count;

}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView

cellForItemAtIndexPath:(NSIndexPath *)indexPath

{

MyCollectionViewCell *myCell = [collectionView

dequeueReusableCellWithReuseIdentifier:@"MyCell"

forIndexPath:indexPath];

 

UIImage *image;

int row = [indexPath row];

 

image = [uIImage imageNamed: *IconImages[row]];

 

myCell.imageView.image = image;

 

return myCell;

}

 

Slik ser min MyCollectionViewController.h ut:

#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UICollectionViewController
@property (strong, nonatomic) NSMutableArray *IconImages;
@end
@interface MyCollectionViewCell : UICollectionViewCell
@property (strong, nonatomic) IBOutlet UIImageView *imageView;

@end

 

Og .m:

 

#import "MyCollectionViewController.h"
@interface MyCollectionViewController ()
@end
@implementation MyCollectionViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
	// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
_IconImages = [@[@"42.png",
			   @"angel.png",
			   @"confused.png",
			   @"cry.png",
			   @"curlylips.png",
			   @"devil.png",
			   @"frown.png",
			   @"gasp.png",
			   @"glasses.png",
			   @"grin.png",
			   @"grumpy.png",
			   @"heart.png"
			   @"kiki.png",
			   @"kiss.png",
			   @"pacman.png",
			   @"penguin.png",
			   @"putnam.png",
			   @"robot.gif",
			   @"shark.png",
			   @"smile.png",
			   @"squint.png",
			   @"sunglasses.png",
			   @"tongue.png",
			   @"unsure.png",
			   @"upset.png",
			   @"wink.png",] mutableCopy];
}

 

Hva er det jeg gjør feil?

 

 

Setter pris på all hjelp, takk på forhånd! :)

Endret av Lami
Lenke til kommentar
Videoannonse
Annonse

Du har ingen variabel som heter IconImages, du har en property som heter IconImages, det er ikke det samme. Hvis du har ny nok versjon av XCode (husker ikke når det ble endret) så lager den get/set metoder for deg automatisk, hvis ikke, legg til @synthesize IconImages; øverst i .m fila rett under @implementation. Etterpå kan du skrive f.eks [[self IconImages] count]; for å aksessere count propertien. For å gjøre det litt mer lesbart, prøv f.eks:

 

int count = [[self IconImages] count];
... bruk count til ettellerannet...

 

Ikke aksesser objective-c objekter med * som når du prøver å skrive *IconImages. Bruk message syntaxen, dvs. [iconImages navnPåFunksjon]. Start propertynavn med liten bokstav, da får du generert metodenavn som matcher resten av objective-c apiet.

Lenke til kommentar

Takk for svar! :)

 

Jeg la til @synthesize iconImages; der du sa, men får fortsatt samme meldingen.

 

Og hvor er det du mener jeg skal skrive inn int count = [[self IconImages] count];?

Der ved return eller?

 

Og når det gjalt *, mener du at jeg skal skrive inn slik her f.eks:

 

image = [uIImage imageNamed: *iconImages[row]];

til image = [iconImages UIImage]

 

 

Beklager, jeg er nub på dette! :blush:

 

EDIT: Jeg bruker forresten nyeste versjon av Xcode.

Endret av Lami
Lenke til kommentar

Se her:

#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UICollectionViewController
@property (strong, nonatomic) NSMutableArray *IconImages;
@end
@interface MyCollectionViewCell : UICollectionViewCell
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@end

Du har definert IconImages i Controller klassen men du prøver bruke den i Cell klassen. Dette kan jeg aldri tenke meg vil fungere

uten videre og forklarer alle feilene rundt IconImages innenfor MyCollectionViewCell.m.

 

Om man ser bort ifra dette og ser kun på syntax:

I error listingen du har postet referes det til MyCollectionViewCell.m. I denne fila har du bl.a. skrevet

-(NSInteger)collectionView:(UICollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section
{
 return *IconImages.count;
}

 

Her er det flere feil. For det første er IconImages en property og bør aksesseres slik: [self IconImages]. I tillgg er count en property på IconImages igjen og bør aksesseres på samme måte. Om du skriver det om til

return [[self IconImages] count];

kan det hende det fungerer bedre.

 

På den neste feilen, image = [uIImage imageNamed: *iconImages[row]]; så er også iconImages aksessert feil. For det første skal det være en stor I og deretter prøver du aksessere som array som ikke gir mening. NSMutableArray har en objectAt selector som gir deg objektet på det indexet. Altså burde du skrevet noe ala

image = [uIImage imageNamed: [[self IconImages] objectAtIndex:row]];

 

Tror du mangler litt basiskunnskaper rundt objective-c om hvordan objekter fungerer og hvordan du bruker de. Kan anbefale denne boken som jeg leste selv når jeg startet med objective-c (forutsetter du kan noe om objektorientering og programmering fra før, for eksempel et annet språk): http://www.amazon.co...erd+ranch+guide. Hvis du leser denne er det lurt å gjøre oppgavene i boka samtidig for å få syntaxen inn i fingrene.

 

Det blir endel bør her, men det er fordi objective-C deseverre (min mening ivertfall) har innført alternative måter å skrive ting på sånn at det skal se mer ut som C, som dot-syntax o.l. Anbefaler å ikke bruke dette slik at du lett ser hva som er objective-C og hva som ikke er det. Ivertfall mens du er i begynnerstadiet.

Lenke til kommentar

Tusen takk for svar! :)

 

Har nå endret på det, men nå får jeg følgende error:

 

No visible @interface for 'MyCollectionViewCell' declares the selector 'IconImages'

 

når jeg endret til

return [[self IconImages] count];

 

Skal se på den boken når jeg er ferdig med denne :)

Endret av Lami
Lenke til kommentar

#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UICollectionViewController
@property (strong, nonatomic) NSMutableArray *IconImages;
@end
@interface MyCollectionViewCell : UICollectionViewCell
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@end

 

Stemmer det, UICollectionViewController inneholder property IconImages, ikke MyCollectionViewCell. Vanskelig å si hva du skal gjøre da det er en logisk brist et sted og ikke et programmatisk problem.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...