Frage

Also, ich habe eine Klasse namens MazeCell, die in "MazeCell.h"

deklariert
#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. Das Komische ist, dass der Code auf dem Simulator fein läuft, es ist nur, dass XCode nicht die Methoden nicht kennt.

Ich war zufrieden, die Nachrichten zu ignorieren, bis XCode würde ich MazeCellEdgeWall verwende nicht zulassen, weil es nicht früher erklärt worden war (alle diese Warnungen und Fehler werden in verschiedenen Klassen).

Also ich habe mich gefragt, ob jemand irgendwelche eklatante Fehler gesehen, die ich verpasst, weil ich in die Programmierung im Allgemeinen bin neu.


Edit:. Ich schließe den Code ursprünglich nicht, da es lange dauert, aber hier ist der Code gibt Fehler

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 ist vorgesehen, um zu beweisen, dass ich codiert Dinge haben. Dieses Programm funktioniert und, wie gesagt, die Labyrinth Zelle Methoden Arbeit tatsächlich tun, es ist nur, dass Xcode mir Warnungen schenkt, die mich nicht kümmern würde, es sei denn, dass es sagt, ich habe MazeCellEdgeExit nicht definiert und so kompiliert nicht mehr , aber es läßt sich anders.


Nun ist dies ziemlich seltsam. Aber ich habe festgestellt, dass die MazeCell.h und MazeCell.m Dateien Duplizieren und Umbenennen von ihnen zu MzCell.h und MzCell.m, und dann jede Bezugnahme auf MazeCell mit MzCell ersetzt dieses Programm bekam auszuführen.

Obwohl das eröffnet mehr Fragen als Antworten ...

War es hilfreich?

Lösung

Alles sieht gut für mich. Versuchen Sie, eine saubere und bauen. Es ist durchaus möglich, dass veraltete Objektdateien Umlauf sind, verwirrend, die Compiler oder Linker.

Ich habe nicht in der Lage gewesen, einen Fehler zu erkennen, die Kompilierung verhindern würde, obwohl es eine Reihe von Scheinspeicherlecks, wie in setMaze ist: wo man nicht loslassen das alte Labyrinth. (Sie auf jeden Fall ein Labyrinth in -initWithFrame zuteilen., So dass Sie Leck zumindest, dass man) Auch die Standard-Setter semantisches sind „zuweisen“, nicht „behalten“ oder „Kopie“ - in diesem Fall würde es scheinen, dass eine der letztere zwei Verhalten würde mehr Sinn machen. Ich weiß, Sie neu in Objective-C, so werden diese durch konstruktives Feedback gemeint, keine Kritik. : -)

Andere Tipps

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-Datei importiert werden.

Es ist möglich, dass das Objekt ( ‚MazeView‘) Sie alloc'ing und init'ing kein ‚MazeCell‘ Objekt sein könnte. Dies kann durch Vernachlässigung verursacht werden, um die MazeCell.h zu importieren als Chuck erwähnt oder Sie einfach die Schaffung des ‚MazeView‘ Objekts mit der falschen Klasse, vielleicht als Folge der Kopie und Ihren eigenen Code einfügen (nur eine Vermutung, wie es scheint Gegen intuitiv ein Objekt einer MazeCell Art zu schaffen und nennt es ‚MazeView‘).

Ich vermute auch, obwohl hat Zugriff nicht sofort zu Xcode zu testen, dass Ihre typedef falsch erklärt werden könnten (oder ich bin einfach mit dieser Syntax Stil nicht vertraut). Versuchen Sie, Ihre 6 Zeilen des typedef mit diesem zu ersetzen.

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

EDIT: Da Sie nur die Implementierungsdatei aufgenommen haben, bemerkte ich, dass es für MazeView ist (Linie 7), aber Ihre ursprüngliche Header-Datei ist für MazeCell. So wie jetzt von, haben Sie eigentlich keinen Code geschrieben (oder nicht geschrieben), die tatsächlich für ein MazeCell Objekt ist.

ich den Verdacht, dass Sie nicht @ synthesize'ed (oder schriftliches Verfahren für sie) alle Ihre Instanzvariablen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top