2013-02-11 4 views
0

레이블에 숫자를 입력하는 키패드 인터페이스를 만들려고합니다. 입력 한 4 자리 핀을 입력하는 키패드의 선을 따라 생각하면 잠금 장치가있는 iOS 기기를 켤 때와 마찬가지로 생각하는 것이 더 쉽습니다.특정 레이블을 참조하는 방법

나는 한 번 타이핑 된 숫자를 보여줄 네 개의 레이블을 가지고 있습니다. 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:@""]; 
    } 
} 

답변

0

이 작업을 수행하는 한 가지 방법은 각 레이블을 NSMutableArray (뷰뿐만 아니라)에 넣는 것입니다. 그럼 당신이 할 수있는 setPin의 각 레이블을 얻을 :.

UILabel *label = [labelArray objectAtIndex:currField]; 
[label setText:[NSString stringWithFormat:@"%i", sender.tag]]; 
currField++; 
+0

을 나는 항상 감동 얼마나 빨리이 포럼에서 질문에 대한 답변을 얻을 수 있습니다. 도와 줘서 고마워. 배열에 레이블을 넣는 개념이 나에게 가장 이해하기 쉽기 때문에 생각해 봅니다. – Typhoon101

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 
} 
+0

길이 검사를 수정하고 싶을 수도 있습니다 -'[[label.text stringByTrimmingCharactersInSet : [NSCharacterSet whitespaceAndNewlineCharacterSet]] length' –

관련 문제