1
  • 我正在尝试使用情节提要在视图控制器中显示问题,并且当用户单击显示答案时。它将它从视图
    控制器带到另一个。另一个视图控制器只显示
    答案并有一个后退按钮。
  • 两个视图控制器使用相同的
    类。用户可以根据问题在应用程序中将下一个和上一个字符串从一个字符串切换到
    另一个字符串。
  • 当我在第一个问题上单击显示答案时,我
    可以看到答案数组中的第一个字符串说大声笑,但是当我进入下一个
    问题并单击显示答案时,它说的答案相同。
  • 我链接了 ib 动作 showanswer,但它似乎没有任何效果。Show Answer 按钮通过 segue 转到另一个视图控制器
    ,并且还有 ib 动作 show answer 链接到它。

所以我的问题是我在 ib 动作 showAnswer 中做错了什么?如果我错误地接近这个抽认卡类型的应用程序,我做错了什么?

//
//  BiologyViewController.m
//  Biology
//
//  Created by Jacob Brans on 6/6/13.
//  Copyright (c) 2013 Jacob Brans. All rights reserved.
//

#import "BiologyViewController.h"

@interface BiologyViewController ()

@end

@implementation BiologyViewController
@synthesize labelsText;
@synthesize textView, textViewanswer1;



-(void)viewDidLoad {
    [super viewDidLoad];

    titles = [NSArray arrayWithObjects:// Time Together
              @"What is Biology?",@"What is yo mamma?",nil];
    step= 0;
    textView.text = [titles objectAtIndex:step];
    answers = [NSArray arrayWithObjects:// Time Together
              @"lol",@"wow",nil];
    textViewanswer1.text = [answers objectAtIndex:step];



    labelsText.text = [NSString stringWithFormat:@"%d/%d", step+1, titles.count];

}


-(IBAction)showanswer:(id)sender{
    textViewanswer1.text = [answers objectAtIndex:step];

}

-(IBAction) nextclicked:(id)sender{
    // titles = [NSArray arrayWithObjects:@"iology is the scientific study of life. Bam",@"This works? Wow",@"lol", nil];
    if (step<titles.count-1) {
        step++;
    }
    else
    {
        step= 0;
    }
    textView.text = [titles objectAtIndex:step];
    labelsText.text = [NSString stringWithFormat:@"%d/%d", step+1, titles.count];
}





-(IBAction) prevClicked:(id)sender{
    //  titles = [NSArray arrayWithObjects:@"Biology is the scientific study of life. Bam",@"This works? Wow",@"Still Works.",@"garret is the coolest awesome person awesome wowowowwwwwwwwwwwwwwwwwwwwwwwwwww", nil];
    if (step>0) {
        step--;
    }
    else
    {
        step =titles.count-1;
    }
    textView.text = [titles objectAtIndex:step];
    labelsText.text = [NSString stringWithFormat:@"%d/%d", step+1, titles.count];
}


-(IBAction) randomClicked:(id)sender{

    step = 1+arc4random() %(titles.count);


    textView.text = [titles objectAtIndex:step];
    labelsText.text = [NSString stringWithFormat:@"%d/%d", step+1, titles.count];
}

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

@end
4

3 回答 3

1

我上周写的原型中有类似的东西。这是一个快速而肮脏的原型,所以我实际上对其中的一些东西进行了硬编码。我可以与您分享,以便您查看示例。我的 segue 代码如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"DessertsCategory"]) {
        CategoryViewController *cvc = (CategoryViewController *)[segue destinationViewController];
        [cvc setCategoryname:@"Desserts"];
    } else if ([[segue identifier] isEqualToString:@"KidsCraftCategory"]){
        CategoryViewController *cvc = (CategoryViewController *)[segue destinationViewController];
        [cvc setCategoryname:@"Kids Crafts"];
    } else if ([[segue identifier] isEqualToString:@"PartyCategory"]){
        CategoryViewController *cvc = (CategoryViewController *)[segue destinationViewController];
        [cvc setCategoryname:@"Party"];
    } else if ([[segue identifier] isEqualToString:@"TrendingCategory"]){
        CategoryViewController *cvc = (CategoryViewController *)[segue destinationViewController];
        [cvc setCategoryname:@"Trending"];
    }
}

基本的东西,寻找 segue 的标识符(每个按钮都有一个 segue),获取目标控制器并在其上调用 setCategoryname 方法(注意,这对于方法来说是一个非常糟糕的名称。如果你使用属性并有一个名为Categoryname 该属性将在调用 synthesize 时为您生成一个 SetCategoryname 方法。因此,您需要给它一个更好的名称,例如“SetValueOfCategoryName”或“UpdateCategoryNameString”,无论您想要什么,只要避免使用 set+propertyName)。

无论如何,在我的 CategoryViewController 上,该方法如下所示:

-(void)setCategoryname:(NSString *)categoryName {
    self.categoryName = categoryName;

}

很简单,您可能只调用类别名称访问器而不是在那里创建方法。事后不知道为什么我这样做,除了我可能是在凌晨 3 点写的,但它有效,所以我会完全按照我的方式给你。然后在我的 CategoryViewController 上,我的 viewWillAppear 方法如下所示:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.lblDiscover.text = self.categoryName;
}

lblDiscover 是我的标签之一,所以我只是在它出现之前设置了该值。如果您愿意,也可以在 viewDidAppear 方法中执行此操作,但随着文本的更改可能会出现一点闪烁:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.lblDiscover.text = self.categoryName;
}

希望对一些人有所帮助。我在 Windows 中工作时写了上一个答案,所以我不得不通过记忆来回忆它,认为它应该仍然可以工作。

于 2013-06-08T00:23:04.397 回答
1

好的,当您推送视图以显示答案时。可变步长设置为零。所以你需要将步骤作为财产。或者将 Step 作为类变量(静态)。

于 2013-06-07T18:11:11.677 回答
0

啊,我认为您的问题是您有一个调用 segue 并调用代码的按钮。你应该只做其中之一。因此,您需要删除该 ibaction 以显示答案并使用以下内容:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"WhateverMySegueIsNamed"]) {
        MyViewController *controller = segue.destinationViewController;
        controller.textViewanswer1.text = [answers objectAtIndex:step];
    } 
}

我通常做的事情不是在不是我正在处理的视图控制器上的标签上设置文本,而是将文本作为属性传递并在 viewWillAppear 上执行。就像是:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"WhateverMySegueIsNamed"]) {
            MyViewController *controller = segue.destinationViewController;
            controller.AnswerString = [answers objectAtIndex:step];
        } 
    }

然后在视图上会出现我会有类似的东西

[super viewWillAppear:animated];
self.lblAnswer.text = self.AnswerString;

如果您使用属性来使用“self”关键字,这也很重要,我有一些实例(在其他语言中也是如此),我认为我正在为我正在处理的对象设置一个属性,但它实际上是在设置一个另一个对象上的值或一起创建一个新对象并设置该值。希望有帮助!

于 2013-06-07T17:58:06.320 回答