0

UIViewのカスタムサブクラスを作成しています。私は現在、Objective Cに基づいて初期化を行っています-カスタムビューとinitメソッドの実装?、コードからロードするかxibからロードするかに関係なく、初期化が行われるようにします。

私が今抱えている問題は、「必須」のプロパティを追加していることです(説明のためにreqPropと呼びましょう)-このプロパティが設定されていないとビューをレンダリングできず、に固有の他の機能の前に設定する必要があります私のビューサブクラスを使用できます。

このため、この要件を適用する自然な場所は、新しいinit関数を提供することであると考えました。したがって、コードの残りの部分全体で設定されていないことを心配する必要はありません。たとえば、

initWithFrame:(CGRect)frame forReqProp:(NSString *)reqProp;

ただし、initWithCoderを使用して初期化するときに、同じ要件を適用する方法がわかりません

私が考えることができる最も近いのは、ユーザー定義のランタイム属性(インターフェイスビルダーでカスタムクラス名を定義する必要がある場所のすぐ下)でこのプロパティを指定することを要求することですが、その場合、いつ/「ブロー」する必要があるかは明確ではありませんプロパティが指定されていないため、「up」。

私が考えることができる他の唯一のオプションは、この必須のプロパティがビューを使用する前に最初に設定する必要があるという非常に明確なドキュメントを持っていることです。

4

2 に答える 2

0

私は現在XCode対応のコンピューターを使用していないため、これをテストすることはできませんが、initWithCoderメソッドからシートを提示すると、メソッドが完了する前にユーザーがreqPropの値を入力する必要があります。

于 2012-07-31T02:30:18.403 に答える
0

ビューを使用する前に最初のプロパティセットであることを要求することで問題を解決できる場合は、初期化には実際には必要ありません。ここでの推奨事項は、優れたドキュメントです。

ただし、根本的な問題はリファクタリングによってより適切に解決される可能性があるため、最初のプロパティセットである必要はありません。この場合、非常に基本的なリファクタリングには、他のプロパティのディクショナリを保存し、必要なプロパティが設定された後にのみそれらを「実際に」設定する(そしてレンダリングに影響を与える)ことが含まれます。

例えば:

- (void) setOptionalProperty1:(id)prop
{
    [propMap setObject:prop forKey:@"property1"];
    if (self.requiredProperty) {
        _optionalProperty1 = prop;
    }
}

- (void) setOptionalProperty2:(id)prop
{
    [propMap setObject:prop forKey:@"property2"];
    if (self.requiredProperty) {
        _optionalProperty2 = prop;
    }
}

- (void) setRequiredProperty:(id)requiredProp
{
    _requiredProperty = requiredProp;
    // now iterate over propMap and set those properties properly
}

これは必ずしも最良のリファクタリングではありませんが、クラスを使用する開発者にその要件を強制することなく、ジョブを実行し、基礎となる制限(必須プロパティを最初に設定する必要があります)をそのまま維持する必要がある一般的な単純な例です。

于 2012-08-23T00:11:21.000 に答える