0

4 Pictures 1 word によく似たインターフェースを備えた小さなゲームを作成しています。現在のセットアップは次のとおりです。ユーザーは、ランダムに生成された 7 文字の単語を取得します。7 文字を受け取り、プログラムで作成された 12 個の UIButton に他の文字をランダムに入力する配列があります。

for (int i=0; i< buttonCount; i++) {
    int xpositiong = x + 37;
    x = xpositiong;

    isSeven ++;
    restAt7 ++;

    NSString *stringFromInt = [NSString stringWithFormat:@"%@",[arrayForRound objectAtIndex:i]];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

    [button addTarget:self
               action:@selector(buttonSelected:)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:stringFromInt forState:UIControlStateNormal];
    button.titleLabel.font = [UIFont fontWithName:@"helvetica" size:19];
    button.tag = i+10;
    _letterButton = button; 

    if (restAt7 == 7) {
        x = 47;
    }

    if (isSeven <= 6) {

        button.frame = CGRectMake(x,333,40,40);
    }
    else
    {
        button.frame = CGRectMake(x,370,40,40);

    }

    [self.view addSubview:button];
}

ボタンの 2 番目の領域もありますが、これらは静的であり、「単語」として構成されます。12 文字の 1 つが選択されると、選択されたボタンのタグが取得され、対応する「単語」ボタンの 1 つが入力されます。

-(void)buttonSelected : (UIButton *)sender
{
 NSLog(@"sender %i", sender.tag);
 UIButton *button = (UIButton *)[self.view viewWithTag:sender.tag];
 button.hidden = YES;

if ([_buttonOne.titleLabel.text isEqualToString: @" "]) {
    // NSLog(@"button is nil");
    [_buttonOne setTitle:sender.titleLabel.text forState:UIControlStateNormal];
    [_buttonOne setTag:button.tag];
}
else if ([_buttonTwo.titleLabel.text isEqualToString:@" "])
{
    [_buttonTwo setTitle:sender.titleLabel.text forState:UIControlStateNormal];
}
else if ([_buttonThree.titleLabel.text isEqualToString:@" "])
{
    [_buttonThree setTitle:sender.titleLabel.text forState:UIControlStateNormal];
}
else if ([_buttonFour.titleLabel.text isEqualToString:@" "])
{
    [_buttonFour setTitle:sender.titleLabel.text forState:UIControlStateNormal];
}

else if ([_buttonFive.titleLabel.text isEqualToString:@" "])
{
    [_buttonFive setTitle:sender.titleLabel.text forState:UIControlStateNormal];
}
else if ([_buttonSix.titleLabel.text isEqualToString:@" "])
{
    [_buttonSix setTitle:sender.titleLabel.text forState:UIControlStateNormal];
}
else if ([_buttonSeven.titleLabel.text isEqualToString:@" "])
{
    [_buttonSeven setTitle:sender.titleLabel.text forState:UIControlStateNormal];
}   

}

選考前

選考後

右!だからここに私の質問があります。ユーザーが間違った文字を選択したと判断し、その文字を削除したい場合は、7 つのボタンのいずれかを押してその文字を削除できます。ただし、もともと文字が入力されていた対応するボタンを非表示にする方法がわかりません...

選択したボタンのタグを保持することと関係があると確信していますが、7 つのボタンのそれぞれにタグが割り当てられているため、どうすればよいかわかりません。

編集:

うまくいった解決策を投稿します。また、すべての関数がループで書き直されました。

-(void)buttonSelected : (UIButton *)sender
{
 NSLog(@"sender %i", sender.tag);
 UIButton *button = (UIButton *)[self.view viewWithTag:sender.tag];
 button.hidden = YES;

for (int i = 0; i < _wordButtonsArray.count; i ++) {

    UIButton *selectedButton = [_wordButtonsArray objectAtIndex:i];

    if ([selectedButton.titleLabel.text isEqualToString:@" "]) {

        [selectedButton setTitle:sender.titleLabel.text forState:UIControlStateNormal];
        [selectedButton setTag:button.tag];
        return;
    }
}
   [self checkIfAnswerIsFinished:sender];

}


- (IBAction)clearButton:(id)sender
{
UIButton *button = (UIButton *)[self.view viewWithTag:[sender tag]];
button.hidden = NO;

for (int i = 0; i < _wordButtonsArray.count; i ++) {

    if (button == [_wordButtonsArray objectAtIndex:i]) {

        [button setTitle:@" " forState:UIControlStateNormal];

        for (int letterButtonsIndex = 0; letterButtonsIndex < _letterButtonsArray.count; letterButtonsIndex++) {

            UIButton *letterButton = [_letterButtonsArray objectAtIndex:letterButtonsIndex];

            if (button.tag == letterButton.tag) {
                button.tag = i;
            letterButton.hidden = NO;
        }
    }
}
}
}

魔法のように動作します!

4

2 に答える 2

1

これを行う 1 つの方法は、それぞれがソース ボタンのタグまたは -1 で埋められた 7 つのスペースを持つ NSArray を作成することです。ユーザーが -1 をタップした場合、何もしません。数値の場合は、タグ付けされたアイテムを可視に設定します。

また、あなたのコードはひどく DRY (Don't Repeat Yourself) ではありません。プログラミングと、データ構造をより適切に使用する方法について考えることに時間を費やす必要があります。より明確なアドバイスが必要な場合は、コメントで質問してください。編集します。:)

于 2013-09-05T23:50:23.013 に答える
1

これを達成するには、いくつかの方法を考えることができます。

解決策 1:

12 個のボタン (下部セクション) を に追加してNSArray、ユーザーが 7 つのボタン (上部セクション) のいずれかを押したときに、その配列を反復処理してタイトルを比較できるようにします。このようなもの:

for (UIButton *button in buttonsArray) {
    NSString *buttonTitle = [button titleForState:UIControlStateNormal];
    // I'm assuming here that you already have the touched button tile
    if ([buttonTitle isEqualToString:touchedButtonTitle]) { 
        button.hidden = NO;
    }
}

解決策 2:

「単語」ボタンと文字ボタンのタグを一致させることができる 7 つの要素の配列を作成します。このようなもの:

-(void)buttonSelected : (UIButton *)sender
{
    NSLog(@"sender %i", sender.tag);
    UIButton *button = (UIButton *)[self.view viewWithTag:sender.tag];
    button.hidden = YES;

    if ([_buttonOne.titleLabel.text isEqualToString: @" "]) {
        // NSLog(@"button is nil");
        [_buttonOne setTitle:sender.titleLabel.text forState:UIControlStateNormal];
        [_buttonOne setTag:button.tag];

        // you know this is object One. Insert tag at position zero (arrays are zero-based)
        self.topButtonsArray insertObject:[NSNumber numberWithInt:sender.tag] atIndex:0];
    }
.
.
.

お役に立てれば!

于 2013-09-05T23:50:30.573 に答える