2012-06-28 4 views
0

UI를 만들기 위해 JSON 문자열을 구문 분석하는 데이터 드라이브 App을 작성하려고합니다. 나는 이것을 구현하고 필요한 통제를 만들었다. 나는 그들에게 할당 된 태그를 기반으로 각 컨트롤을 구분하고 있는데, 이는 효율적인 방법이 아닙니다. UIControl을 동적으로 생성하는 동안 이름 (다음 예에서 레이블 및 텍스트 필드 제외)을 할당하는 방법이 있습니까? 당신이 범주를 통해 UIControl에 바르를 추가 할 수는 없지만iOS : UIControl에 동적으로 이름을 지정하고 할당합니다.

NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity: myArrayCount]; 
for (loop = 0; loop< myArrayCount; loop++) { 
    NSString *propertyName = [NSString stringWithFormat:@"Label %d", loop]; 
    [myArray addObject:propertyName]; 

    CGRect labelFrame = CGRectMake(xLabel, yLabel, widthLabel, heightLabel); 
    UILabel *label = [[UILabel alloc] initWithFrame: labelFrame]; 
    label.tag = loop; 
    [label setText:propertyName]; 
    [label sizeToFit]; 
    [self.view addSubview:label]; 

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(xTextField, yTextField, widthTextField, heightTextField)]; 
    textField.tag = loop; 
    textField.borderStyle = UITextBorderStyleRoundedRect; 
    textField.font = [UIFont systemFontOfSize:15]; 
    textField.placeholder = @"Enter parameter value"; 
    textField.autocorrectionType = UITextAutocorrectionTypeNo; 
    textField.keyboardType = UIKeyboardTypeDefault; 
    textField.returnKeyType = UIReturnKeyDone; 
    textField.clearButtonMode = UITextFieldViewModeWhileEditing; 
    textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
    textField.returnKeyType = UIReturnKeyDone; 
    textField.delegate = self; 
    [self.view addSubview:textField]; 

    yLabel = yLabel+yOffset; 
    yTextField = yTextField+yOffset; 

} 
+0

태그처럼 문을 통해 컨트롤을 검색 할 수 있습니다 동적 식별 할 수있는 효율적인 방법입니다 UIControls, 만약 당신이 이름으로 간다면 그것은 좀 더 복잡한 일이 될 것입니다. – rishi

+0

나는 누군가 다른 해결책이 있는지 궁금해한다. 특정 텍스트 필드의 값에 액세스 할 때마다 모든 텍스트 필드를 구문 분석하고 올바른 태그를 사용하여 값을 가져와 값을 가져야합니다! 게다가 나는 버튼, 세그먼트 컨트롤, uipicker 등등과 같은 많은 다른 컨트롤을 가지고 있습니다 ... 나는 그들 모두를 위해 태그를 사용할 수 있습니까? – applefreak

답변

0

Apple Docs를 참조하십시오 키.

(생략 세부 사항의 일부와 코드의 수정) 같은 아마 뭔가 :

NSMutableDictionary *controlsDictionary = [[NSMutableDictionary alloc] init]; 
for (loop = 0; loop< myArrayCount; loop++) { 

CGRect labelFrame = CGRectMake(xLabel, yLabel, widthLabel, heightLabel); 
UILabel *label = [[UILabel alloc] initWithFrame: labelFrame]; 
[controlsDictionary setObject:label forKey:[NSString stringWithFormat:@"label%d", loop]]; 

UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(xTextField, yTextField, widthTextField, heightTextField)]; 
[controlsDictionary setObject:label forKey:[NSString stringWithFormat:@"textField%d", loop]]; 

yLabel = yLabel+yOffset; 
yTextField = yTextField+yOffset; 

} 

는 그런 다음 [controlsDictionary objectForKey:@"label1"]

+0

그것은 실제로 내가하고있는 일입니다. 열쇠는 사실 태그 값입니다! – applefreak

+1

차가움. 'UIView'에 대한'viewWithTag' 메소드도 참고하십시오.이 메소드는 자신 만의 사전을 유지하지 않고도 태그가있는 서브 뷰를 직접 찾을 수있게 해줍니다. –

+0

와우! viewWithTag가 멋지다고 생각합니다! 고마워. – applefreak

0

, 추가 할 수 관련이 거의 같은 기능을 수행 할 수 있습니다, 개체.

static char kControlNameKey; 

- (void) setControlName: (NSString *) name 
{ 
    objc_setAssociatedObject(self, &kControlNameKey, name, OBJC_ASSOCIATION_COPY); 
} 

- (NSString *) controlName 
{ 
    return (NSString *)objc_getAssociatedObject(array, &kControlNameKey); 
} 

그것보다 더있다, 난 당신이 협회는 새로운 하나를 설정하기 전에 존재하는지 확인해야 겠네요, 그렇지 않으면 누출 :

그래서,이 같은 UIControl에 범주를 만들 , 그러나 이것은 당신에게 시작을 제공해야합니다.

더 많은 세부 정보를 동적으로 생성을 가진 NSMutableDictionary에 넣어하는 것입니다 이름으로 동적으로 생성 된 컨트롤을 참조하려면 컨트롤을 검색하는 한 가지 방법을 [self.view viewWithTag:tag]를 사용하지 않는 가정

+0

그냥 간단한 질문입니다. 텍스트 필드에 입력 된 값이 연관된 객체에 의해 보류됨을 의미합니까? – applefreak

+0

아니요, 연결된 객체는 인스턴스에 추가 할 수있는 iVar과 비슷합니다.이 경우 모든 UIControl에 NSString 속성 인 controlName을 추가하는 것과 같습니다. –

관련 문제