1

私は「システム」と呼ばれる1つのクラスを持っており、いくつかの変数と2つの配列が含まれています。他の2つのクラスからこれにアクセスする必要があります。これらのクラスは、その変数の読み取りと書き込みができるはずです。

System.h

@interface System : UIViewController{

float length_of_one_hour; 
float length_of_first_break;
float length_of_second_break;
float length_of_lunch_break;
float length_of_shortned_hour;
float school_begin;

int school_end[5];
float school_length[5]; 

}

About_now.m

- (void)read_school_end_monday{

school_end_label.text=[NSString stringWithFormat:@"%i", school_end[0]];

}

Settings.m

- (IBAction)set_school_end_monday{

school_end[0]= [school_end_on_mondays_textfield.text intValue];

}

しかし、変数がSystemクラスに保存され、どこからでもアクセスできることをSystem.hとAbout_now.mに何を書くべきかわかりません。そして、はい、私はすでに@publicとexternを試しました。ところで、すでに機能している関数を使用して(1時間の長さを使用して、学校が実際に開始するときなどに)計算するため、school_endの配列が必要ですが、後でAbout_nowクラスの変数にアクセスする必要があります。 。

私を助けてくれる人がいることを願っています。ありがとう

4

4 に答える 4

0

それを行うための多くの設計オプションがあります。

  1. グローバルSystemオブジェクトを作成します。

  2. Systemクラスをシングルトンにする;

  3. Systemクラスレベル(オブジェクトレベルではなく)で「プロパティ」のアクセサメソッドを提供するように、クラスインターフェイスを定義します。

  4. 現在のようにインスタンス化Systemし、初期化パラメーターとして他の2つのクラスに渡します。

さて、より詳細に:

(1)宣言:

     extern System* globalSystemObject;

System.h; 次に、以下を定義します。

static System* globalSystemObject = nil;

System.mglobalSystemObjectコードのどこかで初期化することを忘れないでください:

globalSystemObject = [[System alloc] init];

そうすることで、globalSystemObjectをインポートする任意のファイルから使用できますSystem.h

(2)シングルトンクラスの実装の詳細については、こちらをご覧ください。多くの人がシングルトンの使用に反対することを提案していることを覚えておいてください(それがグローバル変数を「隠す」ための唯一の方法である場合)。この特定のケースでは、Systemと呼ばれるクラスのセマンティクスを考慮すると、シングルトンが最適なオプションだと思います。

(3)クラスは次のようになります。

    @interface System : UIViewController{
    }
    +(float)length_of_one_hour;
    +(void)set_length_of_one_hour:(float)length;

    +(float)length_of_first_break;
    +(void)length_of_first_break:(float)length;

    ...
    @end

これらの変数は、1のような静的変数を使用して.mファイルに実装します。

(4)これは非常に簡単です。唯一のことはSystem、同じスコープ内にインスタンスと他の2つのクラスのインスタンスを作成する必要があるということです。

System* system = [[System alloc] init];
about_now* anow = [[about_now alloc] initWithSystemInstance:system];
...

パラメータは、のsystemivar(またはプロパティ)内に格納されますabout_now

そのようにすることで、グローバル変数(シングルトンマスクの背後に隠されている変数でさえ)の使用を完全に回避できます。

于 2012-04-26T20:05:32.797 に答える
0

getters / setters(@property / @synthesize)を介してシステムインスタンス変数を公開し、他のクラスインスタンスへの参照を渡すことができます。

@interfaceシステム:UIViewController {

float length_of_one_hour; // ... @property(nonatomic、assign); .. @終わり

OtherClass other = [[OtherClass alloc] initWithSystem:sys]; またはセッター[othersetSystem:sys];

于 2012-04-26T21:04:30.270 に答える
0

Systemのインスタンスへのポインタが必要です。したがって、メンバー変数にアクセスするには、次のようにします。

System* system = GetSystem();
system->school_end[0] = whatever();

これは、構造体ポインタを介してメンバーにアクセスするのとまったく同じです。

ただし、メソッドを介してアクセスを非表示にすることをお勧めします。

- (int)getSchoolEndAtIndex:(int)index
{
    return school_end[index];
}
于 2012-04-26T20:06:33.587 に答える
0

iOS アプリのクラス間でデータを共有する一般的な方法は、シングルトンパターンに従うことです。

SystemModel.h

#import <Foundation/Foundation.h>

@interface SystemModel : NSObject {
    @public
    float length_of_one_hour; 
    float length_of_first_break;
    float length_of_second_break;
    float length_of_lunch_break;
    float length_of_shortned_hour;
    float school_begin;

    int school_end[5];
    float school_length[5]; 
}
+(SystemModel*)instance;
@end

SystemModel.m

@implementation SystemModel
static SystemModel* _instance= nil;

+(SystemModel*)instance {
    @synchronized([SystemModel class]) {
        if (!_instance)
            [[self alloc] init];
        return _instance;
    }
    return nil;
}

+(id)alloc {
    @synchronized([SystemModel class]) {
        return (_instance = [super alloc]);
}
    return nil;
}

-(id)init {
    self = [super init];
    if (self != nil) {
        // your init code
    }
    return self;
}

@end

これで、インスタンスを次のように使用できます。

 float tmp = [SystemModel instance]->length_of_one_hour;

インスタンス変数をpropertiesに変換し、ドット構文を使用することもできます。float と array では問題ありませんが、idプロパティを使用するベースのオブジェクトの場合は優先されます。

于 2012-04-26T20:10:22.837 に答える