1

すべて同じように設定する必要があるが、フレームが異なる UILabels がたくさんあります。それらがたくさんあるので、それを行う関数を作成してコードの量を減らすと思いました:

-(void)addField:(UILabel *)label withFrame:(CGRect)frame toView:(id)view {
    label = [[UILabel alloc] initWithFrame:frame];
    label.layer.cornerRadius = 3;
    [view addSubview:label];
}

次の方法で呼び出します。

[self addField:fieldOneLabel withFrame:CGRectMake(20, 180, 61, 53) toView:theView];

これは、フィールドが正しく表示されるまで機能しますが、それを調べると、fieldOneLabel が初期化されていないため、UILabel が参照されなくなりました。& を使用する必要があるかもしれないと思っていましたが、コンパイルエラーが発生するため、私の理解は正しくないと思います。私は何をすべきですか?

4

3 に答える 3

1
-(void)addField:(UILabel * __autoreleasing *)fieldOneLabel withFrame:(CGRect)frame toView:(id)view {
    if (fieldOneLabel != nil) {
        *fieldOneLabel = [[UILabel alloc] initWithFrame:frame];
        (*fieldOneLabel).layer.cornerRadius = 3;
        [view addSubview:(*fieldOneLabel)];
    }
}

次の方法で呼び出します。

[self addField:&fieldOneLabel withFrame:CGRectMake(20, 180, 61, 53) toView:theView];

__autoreleases を使用すると、アーク メモリの問題を回避できます

于 2013-09-25T06:20:37.533 に答える
0

UILabel を関数に送信せずに、作成されたラベルを返すように変更しました。

-(UILabel *)addFieldWithFrame:(CGRect)frame toView:(id)view {
    UILabel *label = [[UILabel alloc] initWithFrame:frame];
    label.layer.cornerRadius = 3;
    [view addSubview:label];
    return label;
}

そして次の方法で呼び出されます:

fieldOneLabel = [self addFieldWithFrame:CGRectMake(self.view.bounds.size.width / 2 - 128, 13, 61, 53) toView:view];

スコットの答えに似ていますが、ビューを別の行に追加することは避けたかったのです。

于 2013-09-30T04:26:34.290 に答える