从另一个类访问位于NSPersistentDocument中的NSProgressIndicator

时间:2012-06-28 02:12:59

标签: objective-c macos xcode4

在我构建的应用程序中,我创建了NSPersistentDocument的TerminalController子类。在TerminalController中有一个NSProgressIndicator的出口,它连接到主窗口nib中的进度指示器的实例。将提供确定进度的进度指示器放在TerminalController类中,因为我希望在从服务器上载或下载数据的过程中使用我的所有各种类。

特别是一个经常用于上传图像的类 - ImageUploader - 它假设触发位于主窗口nib中并连接到TerminalController的进度指示器。

我的问题是我似乎无法弄清楚如何从ImageUploader访问TerminalController中的进度指示器。我无法在主窗口nib中创建ImageUploader的实例并在那里连接,因为ImageUploader经常在代码中初始化并发布。

必须有一种方法可以从我想到的任何物体进入。 我的一个想法是制作进度指示器全局实例,但我从结构的角度来看是错误的,不推荐。

我真的很感激有关此问题的任何建议

以下是我的代码示例

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];
}

1 个答案:

答案 0 :(得分:1)

如果您无法建立直接XIB连接(通过IBOutlet从一个视图控制器到另一个视图控制器),那么您最好的选择是use "NSNotifications" to pass along a message感兴趣的观察者(即从您的ImageUploader到您的TerminalController),或者您可以让您的TerminalController以某种方式注册为ImageUploader的委托,然后以这种方式更新您的进度指示器。