0

私は Objective C を初めて使用し、UI 作成の基本を学ぼうとしています。私のUIViewクラスでは、ボタンとともにグリッドを作成しましたが、これらのボタンは実際には存在しません(私が知る限り)。理想的には、ボタンをクリックすると画像が変わるはずですが、そうはなりません。修正するにはどこを見ればよいですか?

- (id)initWithFrame:(CGRect)frame {
    if( self = [super init]){
        tiles_ = [NSMutableArray array];
        tileClosed = NO;
    }
    return self = [super initWithFrame:frame];
}

- (void) initTile : (Tile *) sender
{
    int MINE_COUNT = 16;
    for(int i = 0; i < MINE_COUNT; i++){
        while(1){
            int rand = random() % [tiles_ count];
            Tile * tile = [tiles_ objectAtIndex:rand];
            if(tile != sender && !tile.isMine){
                tile.isMine = YES;
                break;
            }
        }
    }
    tileClosed = YES;
}


- (void)drawRect:(CGRect)rect 
{
    NSLog( @"drawRect:" );

    CGContextRef context = UIGraphicsGetCurrentContext();
      // shrink into upper left quadrant
    CGRect bounds = [self bounds];          // get view's location and size
    CGFloat w = CGRectGetWidth( bounds );   // w = width of view (in points)
    CGFloat h = CGRectGetHeight ( bounds ); // h = height of view (in points)
    dw = w/16.0f;                           // dw = width of cell (in points)
    dh = h/16.0f;                           // dh = height of cell (in points)

    NSLog( @"view (width,height) = (%g,%g)", w, h );
    NSLog( @"cell (width,height) = (%g,%g)", dw, dh );   

    // draw lines to form a 16x16 cell grid
    CGContextBeginPath( context );               // begin collecting drawing operations
        for ( int i = 1;  i < 16;  ++i )
    {
        // draw horizontal grid line
        CGContextMoveToPoint( context, 0, i*dh );
        CGContextAddLineToPoint( context, w, i*dh );

    }
    for ( int i = 1;  i < 16;  ++i )
    {
        // draw vertical grid line
        CGContextMoveToPoint( context, i*dw, 0 );
        CGContextAddLineToPoint( context, i*dw, h );
    }
    for(int x=1; x<16;x++){
        for(int y=1;y<16;y++){

            Tile * tile = [[Tile alloc] init];
            [tile setFrame:CGRectMake(x * 16.0f, y * 16.0f, 16.0f, 16.0f)];
            [tile addTarget:self action:@selector(clickCell:) forControlEvents:UIControlEventTouchUpInside];
            [tiles_ addObject: tile];        }

    }
    [[UIColor grayColor] setStroke];             // use gray as stroke color
    CGContextDrawPath( context, kCGPathStroke ); // execute collected drawing ops

}

- (void) clickCell : (Tile *) sender
{
    if(! tileClosed) [self initTile: sender];
    [sender open];
}
4

2 に答える 2

0

initメソッドが正しくないため、次のように変更できます。

    - (id)initWithFrame:(CGRect)frame 
      {
        self = [super initWithFrame:frame]
        if( self)
        {
          tiles_ = [NSMutableArray array];
          tileClosed = NO;
        }
        return self;
      }

ボタンが表示されるためには、それをサブビューに追加していません。

    [self.view addSubview:tile]; 

不足している。

于 2013-03-04T14:19:15.740 に答える
0

メソッドinitwithFrame:が壊れています。戻り行はreturn self;.

現時点で実際に行っていることはtiles_配列を壊すため、最終的には nil になるため、タイルを格納しようとしても何もしません (したがって、保持されません)。

于 2013-03-04T01:49:04.733 に答える