2009-08-03 3 views
1

So gehören zu wollen, ich habe eine Klasse namens MazeCell, die in „MazeCell.h“ deklariert wirdXcode scheint nicht meine Klasse

#import <Foundation/Foundation.h> 

enum { 
    MazeCellEdgeWall = 0, 
    MazeCellEdgeGate = 1, 
    MazeCellEdgeExit = 2 
}; 
typedef NSUInteger MazeCellEdge; 

@interface MazeCell : NSObject { 
    MazeCellEdge left; 
    MazeCellEdge right; 
    MazeCellEdge down; 
    MazeCellEdge up; 
    NSUInteger drawCount; 
    NSUInteger row; 
    NSUInteger column; 
} 
@property MazeCellEdge left; 
@property MazeCellEdge right; 
@property MazeCellEdge down; 
@property MazeCellEdge up; 
@property NSUInteger drawCount; 
@property NSUInteger row; 
@property NSUInteger column; 

- (id)initWithLeft:(MazeCellEdge)newLeft 
      right:(MazeCellEdge)newRight 
       up:(MazeCellEdge)newUp 
       down:(MazeCellEdge)newDown 
       row:(NSUInteger)newRow 
      column:(NSUInteger)newColumn; 
@end 

Xcode hält Warnungen wie "warning: 'MazeView' may not respond to '-left'" für alle Methoden anzuzeigen. Die lustige Sache ist, dass der Code auf dem Simulator gut läuft, nur dass XCode die Methoden nicht kennt.

Ich war zufrieden, die Nachrichten zu ignorieren, bis XCode mich nicht MazeCellEdgeWall verwenden ließ, weil es zuvor nicht deklariert worden war (alle diese Warnungen und Fehler sind in verschiedenen Klassen).

Also habe ich mich gefragt, ob irgendjemand eklatante Fehler gesehen hat, die ich vielleicht verpasst habe, weil ich neu im Programmieren bin.


Edit: ich ursprünglich nicht enthalten den Code, da es lang ist, aber hier ist der Code eine Fehlermeldung.

Hier ist "MazeCell.m":

#import "MazeCell.h" 

@implementation MazeCell 

@synthesize left; 
@synthesize right; 
@synthesize down; 
@synthesize up; 
@synthesize drawCount; 
@synthesize row; 
@synthesize column; 

-(id) init { 
    if (self = [super init]) { 
     right = MazeCellEdgeWall; 
     up = MazeCellEdgeWall; 
     left = MazeCellEdgeWall; 
     down = MazeCellEdgeWall; 
     drawCount = 0; 
    } 
    return self; 
} 

- (id)initWithLeft:(MazeCellEdge)newLeft 
      right:(MazeCellEdge)newRight 
       up:(MazeCellEdge)newUp 
       down:(MazeCellEdge)newDown 
       row:(NSUInteger)newRow 
      column:(NSUInteger)newColumn 
{ 
    if (self = [super init]) { 
     left = newLeft; 
     right = newRight; 
     up = newUp; 
     down = newDown; 
     drawCount = 0; 
     row = newRow; 
     column = newColumn; 
    } 
    return self; 
} 
@end 

Hier ist MazeView.h:

#import "MazeView.h" 
#import "MazeCell.h" 
#import "NSMutableArray+Stack.h" 

#define kCellSidesSize 80.0 

@implementation MazeView 

@synthesize maze; 
@synthesize controller; 
@synthesize interfaceOrientation; 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     interfaceOrientation = UIInterfaceOrientationPortrait; 
     [self setBackgroundColor:[UIColor greenColor]]; 
     [self setUserInteractionEnabled:YES]; 
     [self setMaze:[[Maze alloc] initWithSize:MazeSizeMake(4, 6)]]; 
    } 
    return self; 
} 

- (void)setMaze:(Maze *)newMaze { 
    maze = newMaze; 
    CGRect newFrame = [self frame]; 
    newFrame.size = CGSizeMake([newMaze size].width * kCellSidesSize, 
           [newMaze size].height * kCellSidesSize); 
    [self setFrame:newFrame]; 
} 

- (void)setInterfaceOrientation:(UIInterfaceOrientation)newOrientation { 
    if (interfaceOrientation != newOrientation) { 
     interfaceOrientation = newOrientation; 
     CGRect oldFrame = [self frame]; 
     [self setFrame:CGRectMake(oldFrame.origin.y, oldFrame.origin.x, 
            oldFrame.size.height, oldFrame.size.width)]; 
     [[self superview] setContentSize:[self frame].size]; 
    } 
} 

- (void)setController:(UIViewController *)newController { 
    if (controller != newController) { 
     controller = newController; 
    } 
} 

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    NSUInteger columns = [[self maze] size].width; 
    NSUInteger rows = [[self maze] size].height; 

    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0); 
    CGContextSetLineWidth(context, kCellSidesSize - 2.0); 
    CGContextSetLineJoin(context, kCGLineJoinRound); 
    CGContextSetLineCap(context, kCGLineCapRound); 

    BOOL isDrawing = NO; 
    MazeCell *aCell; 
    NSMutableArray *aStack = [[NSMutableArray alloc] init]; 
    NSUInteger row = 0; 
    NSUInteger column = 0; 

    while (YES) { 
     aCell = [maze getCellInRow:row andColumn:column ofOrientation:interfaceOrientation]; 

     if (isDrawing) { 
      CGContextAddLineToPoint(context, row * kCellSidesSize + kCellSidesSize/2.0, 
              column * kCellSidesSize + kCellSidesSize/2.0); 
     } else { 
      isDrawing = YES; 
      CGContextMoveToPoint(context, row * kCellSidesSize + kCellSidesSize/2.0, 
             column * kCellSidesSize + kCellSidesSize/2.0); 
     } 

     if ([aCell left] == MazeCellEdgeExit && [aCell drawCount] < 1) { 
      //Warnings and errors 
      [aCell setDrawCount:1]; //Warning 
      column--; 
     } else if ([aCell right] == MazeCellEdgeExit && [aCell drawCount] < 2) { 
      //Warnings and errors 
      [aCell setDrawCount:2]; //Warning 
      column++; 
     } else if ([aCell up] == MazeCellEdgeExit && [aCell drawCount] < 3) { 
      //Warnings and errors 
      [aCell setDrawCount:3]; //Warning 
      row--; 
     } else if ([aCell down] == MazeCellEdgeExit && [aCell drawCount] < 4) { 
      //Warnings and errors 
      [aCell setDrawCount:4]; //Warning 
      row++; 
     } else if ([aStack count] > 0) { 
      aCell = [aStack pop]; 
      row = [aCell row];  //Warning 
      column = [aCell column]; //Warning 
      isDrawing = NO; 
     } else { 
      break; 
     } 
    } 
    CGContextStrokePath(context); 
    [aStack release]; 
} 

@end 

Auch dies vorgesehen ist, zu beweisen, dass ich codiert Dinge haben. Dieses Programm funktioniert und, wie gesagt, die Labyrinthzellen-Methoden funktionieren tatsächlich, nur Xcode gibt mir Warnungen, die mich nicht interessieren würden, außer dass es besagt, dass ich MazeCellEdgeExit nicht definiert habe und daher nicht mehr kompiliere , aber es kompiliert sonst.


Jetzt ist das ziemlich seltsam. Aber ich habe entdeckt, dass die Dateien MazeCell.h und MazeCell.m dupliziert und in MzCell.h und MzCell.m umbenannt wurden, und dann jeden Verweis auf MazeCell durch MzCell ersetzt hat, dass dieses Programm ausgeführt wurde.

Obwohl, dass mehr Fragen eröffnet als Antworten ...

+0

In dem Prozess der Formatierung Ihrer Antwort für die Klarheit und um sicherzustellen, dass ich es verstanden habe, habe ich ein paar kleine Verbesserungen, die Sie nützlich finden können. Eine, die ich noch nicht geändert habe, ist, dass [MazeCell init] so gut wie gar nichts tut, da Objective-C-Instanzvariablen beim Erstellen des Objekts auf Null initialisiert werden. (Und, wie Sie bemerken werden, 0 ist der Enum-Wert für die Wand, der Ihr Standard ist - das war gut gewählt, wenn auch nur zufällig.) –

Antwort

2

Alles sieht gut zu mir. Probieren Sie eine saubere und bauen. Es ist durchaus möglich, dass veraltete Objektdateien herumschweben und den Compiler oder Linker verwirren.

Ich konnte keinen Fehler finden, der Kompilierung verhindern würde, obwohl es eine Reihe von offensichtlichen Speicherlecks gibt, wie in setMaze: wo Sie das alte Labyrinth nicht freigeben. (Sie weisen definitiv ein Labyrinth in -initWithFrame zu: so dass Sie mindestens das eine durchlecken.) Auch die Standard-Setzer-Semantik ist "zuweisen", nicht "behalten" oder "kopieren" - in diesem Fall scheint es, dass einer der Letztere zwei Verhaltensweisen würden mehr Sinn ergeben. Ich erkenne, dass du neu bei Objective-C bist, also sind diese mit konstruktivem Feedback gemeint, nicht mit Kritik. :-)

+0

zurückgeben Während ich bereits den Code funktioniere, stelle ich mir vor, dass dies das eigentliche Problem war, weil ich redo die MazeCell-Datei ein paar Mal. Ich wusste nicht, dass es so etwas wie Clean and Build gab. Danke. – Joe

+0

Kein Problem. Während der Compiler Dateien, die Sie direkt ändern, neu generiert, kann Code, den Sie nicht geändert haben, immer noch mit der alten Version des modifizierten Codes kompiliert werden (was in Ihrem Fall wahrscheinlich nicht alle Methoden deklariert hat), daher die Warnungen. Ich strukturiere meine Projekte so, dass ich den Ordner 'build' neben der Xcode-Projektdatei vollständig löschen kann und alles sauber neu erstellt wird. Schön, dass es jetzt funktioniert! :-) –

1

Sie vernachlässigen den Code enthalten, die die Warnungen tatsächlich ist zu erzeugen, aber es klingt wie, wo immer es ist, haben Sie nicht die MazeCell.h Header importiert Datei.

0

Es ist möglich, dass das Objekt ('MazeView'), das Sie zuweisen und init'ing, möglicherweise kein 'MazeCell'-Objekt ist. Dies kann darauf zurückzuführen sein, dass Sie das MazeCell.h nicht wie von Chuck erwähnt importiert haben oder einfach das "MazeView" -Objekt mit der falschen Klasse erstellt haben, möglicherweise aufgrund des Kopierens und Einfügens Ihres eigenen Codes (nur eine Vermutung, da intuitiv ein Objekt eines MazeCell-Typs zu erstellen und es "MazeView" zu nennen.

Ich vermute auch, obwohl keinen Zugriff auf Xcode, um zu testen, dass Ihr Typdef möglicherweise falsch deklariert werden (oder ich bin einfach nicht vertraut mit dieser Syntax-Stil). Versuchen Sie, Ihre 6 Zeilen des Typedef mit diesem zu ersetzen.

typedef enum { 
    MazeCellEdgeWall = 0, 
    MazeCellEdgeGate = 1, 
    MazeCellEdgeExit = 2 
} MazeCellEdge; 

EDIT: Da Sie gerade die Umsetzung Datei enthalten ist, habe ich bemerkt, dass es für MazeView ist (Linie 7), aber Ihre ursprüngliche Header-Datei ist für MazeCell. Im Moment haben Sie tatsächlich keinen Code geschrieben (oder keinen geschrieben), der eigentlich für ein MazeCell-Objekt ist.

Ich vermute auch, dass Sie keine Ihrer Instanzvariablen synthetisierten (oder für sie geschriebene Methoden).

+0

MazeCell und MazeView sind in der Tat verschiedene Klassen. Ich gebe einfach #import "MazeCell.h" in den Code, um zu demonstrieren, dass ich auf jeden Fall MazeCell.h importieren Ihre Empfehlung hat leider nicht funktioniert. – Joe

+0

In Ihrer MazeView-Implementierung haben Sie ein Maze-Objekt (wie in setMaze: (Maze *) newMaze), es scheint, dass es eine Methode getCellInRow: andColumn: ofOrientation hat, die aCell tatsächlich als MazeCell setzt. Ich würde sicherstellen, dass das, was es zurückgibt, tatsächlich ein MazeCell ist. – Neil

+0

Es gibt eine MazeCell zurück – Joe