0

私はこのような状況にあります:

2つのビューコントローラと1つのビュー

左足のボタンをクリックすると、2番目のコントローラーのビューに左足の画像が表示され、右ボタンをクリックすると、ビューに右足の画像が表示されます。

最初のコントローラーでは、右または左を選択するためにこれを作成しました。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    RSViewController *vc = [segue destinationViewController];

    if ([[segue identifier] isEqualToString:@"Left-Foot"])
        [vc setLeft:YES];
    else
        [vc setLeft:NO];
}

2番目のコントローラーには、ブール値を設定するメソッドがあります

- (void)setLeft:(BOOL)left
{
    if (left) {
        _left = left;
        NSLog(@"LEFT UPDATED IN RSVIEWCONTROLLER");
    }else {
        _left = left;
        NSLog(@"RIGHT UPDATED IN RSVIEWCONTROLLER");
    }
}

同じコントローラーで、1つのinitを使用してviewdidloadにビューを作成します。

- (void)viewDidLoad
{
    NSLog(@"meeeea");
    [super viewDidLoad];
    CGRect rect = CGRectMake(0, 0, 100, 100);
    self.animatedCircleView = [[RSAnimatedCircleView alloc] initWithFrameFoot:rect foot:YES];
    NSLog(@"Viewdidnoload");
}

そして私の見解では(写真の小さな青い長方形):

- (void)setup:(BOOL)left
{
 self.leftFoot = left;
}

- (void)setLeftFoot:(BOOL)leftFoot
{
    _leftFoot = leftFoot;
}

- (void)awakeFromNib
{
    [self setup:_leftFoot];
}

- (id)initWithFrameFoot:(CGRect)frame foot:(BOOL)left
{
    self = [super initWithFrame:frame];
    [self setup:left];
    self.leftFoot = left;

    if (self.leftFoot)
        NSLog(@"Left == TRUE");

    return self;

}

- (RSFootView *)footView
{
    CGRect rect = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height);
    if (self.leftFoot) {
        NSLog(@"Now left is yes");

    }else {
        NSLog(@"left is no");
    }

    _footView = [[RSFootView alloc] initWithFrame:rect withLeftFoot:self.leftFoot];
    [_footView setBackgroundColor:[UIColor clearColor]];


    return _footView;
}

- (void)drawRect:(CGRect)rect
{
    if (self.leftFoot)
        NSLog(@"left ada");
    else
        NSLog(@"right masd");

    CGFloat x = self.bounds.size.height;
    CGFloat y = self.bounds.size.width;
    CGFloat radius = x/2 - 15;
    CGPoint center = CGPointMake(x/2, y/2);
    CGFloat startAngle = DEGREES_TO_RADIANS(START_ANGLE);
    CGFloat endAngle = DEGREES_TO_RADIANS(END_ANGLE);

    // Drawing the sector
    UIBezierPath *sector = [UIBezierPath bezierPathWithArcCenter:center
                                                          radius:radius
                                                      startAngle:startAngle
                                                        endAngle:endAngle
                                                       clockwise:YES];

    sector.lineWidth = 4;

    [[UIColor grayColor] setStroke];
    [sector stroke];
    [self setBackgroundColor:[UIColor clearColor]];
    [sector addClip];

    [self addSubview:self.footView];

}

メソッド「drawRect」では、左足の値は常にfalseです。なんでこんな感じなのかわからない…誰か助けてくれませんか?

ありがとうございました

4

1 に答える 1

2

次の行では、毎回ビューを「左」に設定しています。

   self.animatedCircleView = [[RSAnimatedCircleView alloc] 
          initWithFrameFoot:rect foot:YES];

これは典型的なエラーであり、変数とメソッドにわかりやすく直感的な名前を付けないと非常に起こりやすくなります。自分のやり方を直さないと、このタイプのエラーが頻繁に発生することが予想されます。

私はあなたのビューにそれが何の足であるかを明示的に示す列挙型プロパティを与えます:

typedef enum {LeftFoot, RightFoot} FootType; 
@property (strong, nonatomic) FootType footType; 

また、メソッド名を修正する必要があります。このメソッドを完全に廃止し、initWithFrameFootのオーバーライドにデフォルトのフットを設定するだけですinitWithFrame。(0のままにしておくとLeftFoot。)@synthesizeセッターやゲッターも必要ありません。それらを削除します。

専用の初期化子が必要な場合は、渡される変数の前に適切な単語が実際に付いていることを確認してください。

-(id) initWithFrame:(CGRect)rect andFootType:(FootType)footType {
    self = [super initWithFrame:rect]; 
    if (self) {
         _footType = footType;  
    }
    return self;
}

使用後@synthesize、正しい足を設定することができますprepareForSegue:

footViewController.footType = rightFoot; 
于 2013-03-24T20:24:36.880 に答える