UIView不接受UIViewControllers数据

时间:2015-11-03 20:39:46

标签: ios objective-c iphone uiview uiviewcontroller

我有一个GameOver UIView,我从我的主UIViewController里面调用。它只是一个“弹出”窗口,文本游戏结束,分数和一些模糊效果模糊了主要的UIViewcontroller。

我尝试将一个int传递给UIView,但它不接受它,除非它在- (void)drawRect:(CGRect)rect方法中。

如果我将分数标签移动到drawRect方法,则标签会更新。但模糊效果消失了。

我做错了什么?

MainViewController.m

#import "GameOverView.h"

@interface ViewController () {
    GameOverView    * gov;
}

- (void) showGameOver {
    gov = [[GameOverView alloc] initWithFrame:self.view.bounds];
    NSLog(@"Passing score of: %i", self.score);
    gov.finalScore = self.score;
    [self.view addSubview:gov];
}

GameOverView.h

@interface GameOverView : UIView {}
@property (nonatomic) int finalScore;
@end

GameOverView.M

@implementation GameOverView
- (id) initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        //self.backgroundColor = [UIColor redColor];

        NSLog(@"Score:%i", self.finalScore  );

        UIVisualEffect *blurEffect;
        blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

        UIVisualEffectView *visualEffectView;
        visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        visualEffectView.frame = super.bounds;
        [super addSubview:visualEffectView];

        UILabel * lblGameOver  = [[UILabel alloc] initWithFrame:CGRectMake(0,0, frame.size.width, 200)];
        lblGameOver.center = CGPointMake(frame.size.width/2, 100);
        lblGameOver.text =   [NSString stringWithFormat: @"GAME OVER %i", self.finalScore];
        [self addSubview:lblGameOver];

        UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 200)];
        button.center = CGPointMake(frame.size.width/2, 200);
        [button setTitle:@"Start New Game" forState:UIControlStateNormal];
        [button addTarget:self action:@selector(removeSelfFromSuperview) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];

    }
    return self;
}
- (void) removeSelfFromSuperview{
     [self removeFromSuperview];
}

2 个答案:

答案 0 :(得分:1)

您正在 GameOverView 类的init方法中使用 finalScore 属性,但您只是在初始化后设置其值。

将初始化方法更改为

- (id) initWithFrame:(CGRect)frame finalScore:(int)fs{
        // use 'fs' instead of 'self.finalScore'
    }

它应该有用。

答案 1 :(得分:1)

我想知道视图背景颜色没有任何问题。您正在初始化视图并将其添加为子视图,如下所示:

 gov = [[GameOverView alloc] initWithFrame:self.view.bounds];
gov.finalScore = self.score;
[self.view addSubview:gov];

这将使视图背景颜色为黑色,这是默认颜色。因此,如果使用模糊效果,则没有太大的区别。

您需要在初始化期间为视图指定颜色:

     gov = [[GameOverView alloc] initWithFrame:self.view.bounds];
[gov setBackgroundColor:[UIColor yourColor]];
[self.view addSubview:gov];

如果您打算将代码保存在initWithFrame中,则无需担心设置背景颜色。如果将代码保存在drawRect中,则必须设置背景颜色,否则它将为黑色。

设置分数标签时,无论是将其放在drawRect还是initWithFrame方法中都无关紧要。确保只有在必须在视图上绘图时才使用drawRect方法,以便稍后可以使用setNeedsDisplay

来调用它