0

私が構築するアプリケーションでは、NSPersistentDocument の TerminalController サブクラスを作成しました。TerminalController には、メイン ウィンドウ nib のプログレス インジケーターのインスタンスに接続された NSProgressIndicator のアウトレットがあります。サーバーからのデータのアップロードまたはダウンロードの過程でさまざまなクラスをすべて使用する必要があるため、決定的な進行状況を提供する進行状況インジケーターは TerminalController クラスに配置されます。

特に、画像のアップロードに頻繁に使用されるクラスが 1 つあります。ImageUploader は、メイン ウィンドウ nib に配置され、TerminalController に接続された進行状況インジケーターをトリガーすることを想定しています。

私の問題は、ImageUploader から TerminalController の進行状況インジケーターにアクセスする方法がわからないことです。ImageUploader はコード内で頻繁に初期化およびリリースされるため、メイン ウィンドウ nib で ImageUploader のインスタンスを作成してそこに接続することはできません。

私が考える任意のオブジェクトからアクセスする方法が必要です。私のアイデアの 1 つは、進行状況インジケーターのグローバル インスタンスを作成することでしたが、構造の観点からは間違っており、お勧めできません。

この問題に関する提案をいただければ幸いです

ここに私のコードのサンプルがあります

NSPersistentDocument の TerminalController サブクラス

@interface TerminalController : NSPersistentDocument{
    IBOutlet NSProgressIndicator *loadingIndicator;
}
@property (retain, nonatomic) NSProgressIndicator *loadingIndicator;

@implementation TerminalController

@synthesize loadingIndicator;

- (void)dealloc
{
    [loadingIndicator release];
    [super dealloc];
}

ImageUploader クラス

@interface ImageUploader : NSObject{
    ...

    NSProgressIndicator  *progressIndictor; // This is progress indicator that should point to TerminalController progress indicator
}

@implementation CustomXMLRequests

- (void) uploadImage:(NSURL *)withUrl{
    ...

    // How to point to progress indicator that is located in TerminalController that is subclass of NSPersistentDocument
    [progressIndictor setUsesThreadedAnimation:YES];
    [progressIndictor startAnimation:self];
    [progressIndictor setMinValue:0.0];
    [progressIndictor setMaxValue:1.0];
}

- (void)connection:(NSURLConnection *)connection 
   didSendBodyData:(NSInteger)bytesWritten 
 totalBytesWritten:(NSInteger)totalBytesWritten 
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite{
    double prgrs = (double)totalBytesWritten/totalBytesExpectedToWrite;
    [progressIndictor setDoubleValue:prgrs];
    [progressIndictor displayIfNeeded];
}
4

1 に答える 1

1

直接の XIB 接続 (1 つのビュー コントローラーから別のビュー コントローラーへの IBOutlet 経由) を確立できない場合、次の最善の策は、" " を使用して、関心のあるオブザーバーNSNotificationsにメッセージを渡すことです(つまり、ImageUploader から TerminalController へ)。または、TerminalController を ImageUploader のデリゲートとして何らかの形で登録し、進行状況インジケーターをそのように更新することもできます。

于 2012-06-28T02:19:04.643 に答える