【问题标题】:Save attribute of a UIButtonUIButton 的保存属性
【发布时间】:2012-05-21 02:04:11
【问题描述】:

我的代码需要一些帮助。 我有一个 UIAlert 会在您第一次打开应用程序时弹出,在该弹出窗口中我有两个按钮,用户将选择其中一个。我希望应用程序记住用户选择哪个按钮来执行某些代码或其他。问题是我这里有这段代码:

-(void)changeLabel{


        progressView.progress += 0.25;
    scan.hidden = YES;


        if (progressView.progress == 1 ) {
            label.hidden = YES;

            progressView.hidden = YES;

            [timer invalidate];

            imagesText.hidden = NO;


            int randomNumber = arc4random() % 4;

            switch (randomNumber) {
                case 0:


                    imagesText.image = [UIImage imageNamed:@"image1.png"];


                    break;

                case 1:


                    imagesText.image = [UIImage imageNamed:@"image2.png"];


                    break;

                case 2:

                    imagesText.image = [UIImage imageNamed:@"image3.png"];

                    break;
                case 3:

                    imagesText.image = [UIImage imageNamed:@"image4.png"];

                default:
                    break;

        }
    }
}

所以我想以某种方式做到这一点,如果用户选择第一个按钮,应用程序将在案例 0,1 和 2 之间切换,如果他选择第二个按钮,它将在 3 和其他按钮之间切换。但我希望代码的开头在两种情况下都相同。 我尝试了一些东西,但它并没有按照我想要的方式工作。 感谢您的帮助!

更新:我已修复错误。所以现在我有这个:

- (void)viewDidLoad
{


    if (![@"1" isEqualToString:[[NSUserDefaults standardUserDefaults] objectForKey:@"alert"] ]) {
        [[NSUserDefaults standardUserDefaults] setValue:@"1" forKey:@"alert"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        UIAlertView *alerta = [[UIAlertView alloc]initWithTitle:@"Welcome!" message:@"Select your language" delegate:self cancelButtonTitle:@"Button1" otherButtonTitles:@"Button2", nil];



        [alerta show];
        [alerta release];

    }


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

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];



   progressView.progress += 0.25;
    scan.hidden = YES;


    if (progressView.progress == 1 ) {
        label.hidden = YES;

        progressView.hidden = YES;

        [timer invalidate];

        imagesText.hidden = NO;

        int randomNumber;

        if ([buttonTitle isEqualToString:@"Button1"]) {

             randomNumber = arc4random() % 3;

        }else if ([buttonTitle isEqualToString:@"Button2"]) {

             randomNumber = arc4random() % 3 + 3;

        }

        switch (randomNumber) {
           //CODE
        }
    }
}

问题是所有代码都应该从以下位置调用:

 - (IBAction)scan:(id)sender {

    label.hidden = NO;
    imagesText.hidden = YES;
    progressView.hidden = NO;


    progressView.progress = 0;

    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(alertView) userInfo:nil repeats:YES];

}

所以我将@selector 更改为alertView 之一,现在当我按下执行所有代码的按钮时,它给了我SIGABRT 错误。任何想法为什么? 感谢您的所有帮助!

【问题讨论】:

  • 您没有(或者您没有显示)名为“alertView”的选择器
  • 那么当我按下按钮时,我怎样才能让所有的代码工作呢?因为它需要在 uialertview 内对吧?
  • 我不确定你现在在做什么—— alertView:clickedButtonAtIndex: 方法是一个委托方法,当你点击一个按钮时 UIAlert 会调用它,你不会显式调用它(如果这就是您在计时器方法中尝试执行的操作)。您需要创建一个属性 buttonTitle 以便它可以在不同的方法中使用——委托方法中唯一需要的是 self.buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];然后你会像我在回答中显示的那样使用 buttonTitle。
  • 哦,我现在知道了,我明天试试,我会告诉你它是否有效。感谢您的宝贵时间
  • 我必须先声明buttonTitle还是什么?我尝试在我放置的 .h 文件上创建一个属性:@property (nonatomic, retain) UIAlertView *buttonTitle;然后我合成了它,但是当我按下执行所有内容的按钮时,我再次收到 SIGABRT 错误

标签: objective-c xcode4 attributes switch-statement


【解决方案1】:

当用户选择一个按钮时,您需要使用该按钮的一些唯一值填充属性,例如其标题或标签。一旦你有了它,你可以在你的 randomNumber 定义之前放一个 if 语句——像这样:

if (buttonTitle isEqualToString:@"First Button") {
        int randomNumber = arc4random() % 3; // Gives choices of 0,1, or 2
    }else if (buttonTitle isEqualToString:@"Second Button"){
        int randomNumber = arc4random() % 3 + 3; // Gives choices of 3,4, or 5
    }

     switch (randomNumber) .... (rest of your code)

在 else-if 语句中,+3 将确保 switch 语句中的选择将从 3 开始并从那里向上(我不知道您还有多少其他选择)。

【讨论】:

  • 我明白你所说的,但是我如何为按钮设置该属性?因为现在按钮出现在 UIAlertView 上。对不起,如果这是一个愚蠢的问题,但我还是有点新手。
  • 在 UIAlertView 委托方法中,alertView:clickedButtonAtIndex:,你会得到点击按钮的索引。您可以将该索引保存到属性中。
  • 好吧,当我把所有代码放在一起时,它说:“使用未声明的标识符'randomNumber'”我是否必须在某个地方创建一个带有 randomNumber 的变量?如果有,在哪里?
  • 哦,对不起,这是我的错——你应该在 if 语句上方声明变量,所以有一行就是: int randomNumber;然后在 if 语句中只使用 randomNumber 而不是它前面的“int”。
  • 成功了,我更新了问题。有时间就去看看吧:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
相关资源
最近更新 更多