0

番号をラベルに入力するキーパッド インターフェイスを作成しようとしています。ロックされた iOS デバイスの電源を入れるときのように、4 桁の PIN を入力して入力するキーパッドの線に沿って考える方が簡単です。

入力した数字が表示される 4 つのラベルがあります。数字を含む 12 個のボタン (およびキャンセル ボタンと削除ボタン) があります。各ボタンにはタグが割り当てられています。ボタンをクリックすると、そのタグが次の空のラベルへのテキストとして入力されます。

私がする必要があるのは、setPin 関数で次の空のラベルを参照することです。私はこれを間違った方法で行っていますか、それとも私が見逃しているのはほんの少しですか? 私のコードの縮小版を以下に示します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[self view] setBackgroundColor:[UIColor whiteColor]];
    [self setCurrField:1];

    // BUILD A VIEW TO CONTAIN THE LOGIN PANEL
    UIView *pinView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 400, 500)];
    pinView.backgroundColor = [UIColor lightGrayColor];

    // CREATE BUTTONS
    int nPos = 1;
    int leftPos;
    int topPos = 134;

    while (nPos <= 12) 
    {
        leftPos = (nPos%3 == 1) ? 19 : leftPos + 113 + 12;
        topPos = (nPos%3 == 1) ? topPos + 61 + 10 : topPos;

        // BUILD THE BUTTONS AND ADD TO THE PAGE
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTag:nPos];
        [btn addTarget:self action:@selector(setPin:) forControlEvents:UIControlEventTouchUpInside];
        [btn setFrame:CGRectMake(leftPos, topPos, 113, 61)];
        [btn setBackgroundColor: [UIColor darkGrayColor]];

        NSString *btnLabel;
        if(nPos <= 9)
        {
            btnLabel = [NSString stringWithFormat:@"%i", nPos];
        }
        else
        {
            switch (nPos) {
                case 10:
                    btnLabel = @"Cancel";
                    break;

                case 11:
                    btnLabel = @"0";
                    break;

                case 12:
                    btnLabel = @"Delete";
                    break;

                default:
                    break;
            }
        }
        [btn setTitle: btnLabel forState:UIControlStateNormal];

        [pinView addSubview:btn];

        nPos++;
    }

    // CREATE THE TEXTBOXES
    UILabel *char1Label = [[UILabel alloc] initWithFrame:CGRectMake(19, 65, 83, 91)];
    UILabel *char2Label = [[UILabel alloc] initWithFrame:CGRectMake(113, 65, 83, 91)];
    UILabel *char3Label = [[UILabel alloc] initWithFrame:CGRectMake(207, 65, 83, 91)];
    UILabel *char4Label = [[UILabel alloc] initWithFrame:CGRectMake(301, 65, 83, 91)];

    [pinView addSubview:char1Label];
    [pinView addSubview:char2Label];
    [pinView addSubview:char3Label];
    [pinView addSubview:char4Label];

    [[self view] addSubview:pinView];

}

-(void)setPin:(UIButton *)sender
{
    if(sender.tag <= 9 || sender.tag == 11)
    {
        [--charLabel[self currField]Label-- setText:[sender tag]];
        [self currField++];
    }
    elseif(sender.tag == 12) 
    {
        [self currField--];
        [--charLabel[self currField]Label-- setText:@""];
    }
}
4

2 に答える 2

1

おそらくあなたがいるクラスのプロパティとして、textLabelsへの参照を保持する必要があります。

@property (nonatomic) NSArray* textLabels; // Choose a more descriptive name than this

...

self.textLabels = @[ char1Label, char2Label, char3Label, char4Label ];


...

- (UILabel*) nextEmptyLabel {

    for (UILabel* label in self.TextLabels) 
    {
         NSString* trimmedText = [label.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
         if ([trimmedText length] == 0) {
             return label;
         }
    }

    return nil;  // No non empty label found
}  
于 2013-02-11T16:35:39.047 に答える
0

これを行う1つの方法は、各ラベルをNSMutableArray(およびビュー)に配置することです。次に、各ラベルを取得するには、次のsetPinようにします。

UILabel *label = [labelArray objectAtIndex:currField];
[label setText:[NSString stringWithFormat:@"%i", sender.tag]];
currField++;
于 2013-02-11T16:34:47.587 に答える