首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当试图使按钮消失一定时间时,exc_bad_access

当试图使按钮消失一定时间时,exc_bad_access
EN

Stack Overflow用户
提问于 2015-08-18 16:38:54
回答 1查看 49关注 0票数 0

我的应用程序出了问题。我有一个登录屏幕,我移动到下一个视图控制器一个按钮,然后我有3个按钮。2是隐藏的,1不是。我想要一个不是(红色的圆圈),当点击运行无效按钮的改变。然而,在这个空白中,我为我创建的int创建了一个随机数。我做了一个if声明:

如果随机编号按钮大于30,则redcircle.hidden = YES;Bluecircle.Hidden = NO;yellowcircle.hidden = YES;

问题是我希望这个按钮在一定的时间内是可见的。所以我把这个放进了空档按钮开关里。

代码语言:javascript
复制
[NSTimer scheduledTimerWithTimeInterval:ButtonTime target:self selector:@selector(setButtonEnabled) userInfo:nil repeats:NO];

每当我运行这段代码时,它都会给出错误:

线程1 EXC_BAD_ACCESS code=2

ButtonTime是一个随机数,要么是1,3,要么是4.0秒。setbuttonEnabled基本上是一个空洞的说法,set bluecircle.hidden = YES;

底线:我的bug Thread 1 EXC_BAD_ACCESS code=2位于特定行:

代码语言:javascript
复制
[NSTimer scheduledTimerWithTimeInterval:ButtonTime target:self selector:@selector(setButtonEnabled) userInfo:nil repeats:NO];`

编辑:我将arc4random更改为arc4random_uniform,但仍然会遇到相同的错误

.m文件:

代码语言:javascript
复制
#import "ViewController.h"
#import "ViewController.m"

@interface ViewController ()

@end

int RandomNumber;
double ButtonTime;
int RandomNumberButton;
int score;

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        if ([[UIScreen mainScreen] scale] == 2.0) {
            if([UIScreen mainScreen].bounds.size.height == 667){
                // iPhone retina-4.7 inch(iPhone 6)
            }
            else if([UIScreen mainScreen].bounds.size.height == 568){
                // iPhone retina-4 inch(iPhone 5 or 5s)
            }
            else{
                // iPhone retina-3.5 inch(iPhone 4s)
            }
        }
        else if ([[UIScreen mainScreen] scale] == 3.0)
        {
            //if you want to detect the iPhone 6+ only
            if([UIScreen mainScreen].bounds.size.height == 736.0){
                //iPhone retina-5.5 inch screen(iPhone 6 plus)
            }
            //iPhone retina-5.5 inch screen(iPhone 6 plus)
        }
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
@implementation Game{
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)viewDidAppear:(BOOL)animated{
    YellowCircle.hidden = YES;
    BlueCircle.hidden = YES;
    RedCircle.hidden = NO;
       score = 0;
}

-(void)ButtonGenerator{
    RandomNumber = arc4random() % 100;

    if (RandomNumber>50) {
        ButtonTime = 3.0;
    }

    if (RandomNumber<50) {
        ButtonTime = 1.0 ;
    }

    if (RandomNumber>10) {
        ButtonTime = 4.0 ;
    }
}

-(void)setButtonEnabled{
        BlueCircle.hidden = YES;
}

-(void)setYellowCircleEnabled{
    YellowCircle.hidden = YES;
}

-(void)ButtonChanger{
    RandomNumberButton = arc4random() % 100;

    if (RandomNumberButton>30) {
        BlueCircle.hidden = NO;
        [NSTimer scheduledTimerWithTimeInterval:ButtonTime target:self selector:@selector(setButtonEnabled) userInfo:nil repeats:NO];

        RedCircle.hidden = YES;
        YellowCircle.hidden = YES;
    }
    if (RandomNumberButton<30) {
        YellowCircle.hidden = NO;
        [NSTimer scheduledTimerWithTimeInterval:ButtonTime target:self selector:@selector(setYellowCircleEnabled) userInfo:nil repeats:NO];
        RedCircle.hidden = YES;
        BlueCircle.hidden = YES;
    }

    if (YellowCircle.hidden = YES, BlueCircle.hidden = YES, RedCircle.hidden = YES) {
        RandomNumber = 0;
        [self ButtonChanger];
    }
}

- (IBAction)RedCircleButton:(id)sender {
    RandomNumber = 0;
    [self ButtonChanger];

    score = score + 1;
}

- (IBAction)BlueCircleButton:(id)sender {
}

- (IBAction)YellowCircleButton:(id)sender {
}

@end

.h文件

代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

@interface Game : UIViewController{
    IBOutlet UIButton *RedCircle;
    IBOutlet UIButton *BlueCircle;
    IBOutlet UIButton *YellowCircle;

}
- (IBAction)RedCircleButton:(id)sender;
- (IBAction)BlueCircleButton:(id)sender;
- (IBAction)YellowCircleButton:(id)sender;
@end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-18 17:24:29

代码2=无限循环。

ButtonChanger正在调用自己,因为条件总是满足的,因此会产生无限数量的计时器,直到系统放弃为止。

您应该真正遵循如何编写清晰可读的代码的指导方针。避免在类或作用域之外声明低级属性。还请记住,属性以小写和类大写开头。对象的引用/指针也是一个属性。

这在一定程度上是你的代码。

代码语言:javascript
复制
#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong) UIButton *blueCircleButton;
@property (nonatomic, strong) UIButton *redCircleButton;
@property (nonatomic, strong) UIButton *yellowCircleButton;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.blueCircleButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.blueCircleButton.frame = CGRectMake(50, 0, 100, 100);
    self.blueCircleButton.backgroundColor = [UIColor blueColor];
    self.redCircleButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.redCircleButton.frame = CGRectMake(50, 100, 100, 100);
    self.redCircleButton.backgroundColor = [UIColor redColor];
    [self.redCircleButton addTarget:self action:@selector(redButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    self.yellowCircleButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.yellowCircleButton.frame = CGRectMake(50, 200, 100, 100);
    self.yellowCircleButton.backgroundColor = [UIColor yellowColor];
    for (UIView *view in @[self.blueCircleButton, self.redCircleButton, self.yellowCircleButton]) {
        [self.view addSubview:view];
    }

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)viewDidAppear:(BOOL)animated{
    self.yellowCircleButton.hidden = YES;
    self.blueCircleButton.hidden = YES;
    self.redCircleButton.hidden = NO;
}

-(void)enableBlueCircle:(NSTimer*)timer {
    self.blueCircleButton.hidden = YES;
}

-(void)enableYellowCircle:(NSTimer*)timer {
    self.yellowCircleButton.hidden = YES;
}

-(void)buttonChanger{
    NSInteger randomNumberButton = arc4random() % 100;

    if (randomNumberButton>30) {
        self.blueCircleButton.hidden = NO;
        [NSTimer scheduledTimerWithTimeInterval:[self generateButtonTime] target:self selector:@selector(enableBlueCircle:) userInfo:nil repeats:NO];

        self.redCircleButton.hidden = YES;
        self.yellowCircleButton.hidden = YES;
    }
    if (randomNumberButton<30) {
        self.yellowCircleButton.hidden = NO;
        [NSTimer scheduledTimerWithTimeInterval:[self generateButtonTime] target:self selector:@selector(enableYellowCircle:) userInfo:nil repeats:NO];
        self.redCircleButton.hidden = YES;
        self.blueCircleButton.hidden = YES;
    }

//    if (self.yellowCircleButton.hidden = YES, self.blueCircleButton.hidden = YES, self.redCircleButton.hidden = YES) {
//        [self buttonChanger];
//    }
}

- (void)redButtonAction:(UIButton *)button {
    [self buttonChanger];
}

-(double)generateButtonTime {
    NSInteger randomNumber = arc4random() % 100;
    double buttomTime = 0;
    if (randomNumber>50) {
        buttomTime = 3.0;
    }

    if (randomNumber<50) {
        buttomTime = 1.0 ;
    }

    if (randomNumber>10) {
        buttomTime = 4.0 ;
    }
    return buttomTime;
}

@end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32078003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档