0

JSON文字列を解析してUIを作成するデータドライブアプリを作成しようとしています。これを実装し、必要なコントロールを作成しました。割り当てられたタグに基づいて各コントロールを区別していますが、これは効率的な方法ではありません。UIControl を動的に作成する際に、名前 (次の例ではラベルとテキストフィールド以外) を 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;

}
4

2 に答える 2

0

UIControlカテゴリを介してiVarを追加することはできませんが、関連付けられたオブジェクトを追加することはできます。これを使用して、ほぼ同じ機能を実行できます。

したがって、次のUIControlようなカテゴリを作成します。

static char kControlNameKey;

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

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

それだけではありません。新しい関連付けを設定する前に、関連付けが存在するかどうかを確認する必要があると思います。そうでない場合は、リークが発生しますが、これで開始できます。

詳細については、AppleDocsを参照してください

于 2012-06-28T09:57:13.707 に答える
0

を使用してコントロールを取得したくない場合[self.view viewWithTag:tag]、動的に作成されたコントロールを名前で参照する 1 つの方法はNSMutableDictionary、動的に生成されたキーを使用してコントロールを に配置することです。

したがって、おそらく次のようなものです(詳細の一部を省略したコードの変更):

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"]

于 2012-07-06T09:47:47.497 に答える