【问题标题】:Accessing NSProgressIndicator located in NSPersistentDocument from another class从另一个类访问位于 NSPersistentDocument 中的 NSProgressIndicator
【发布时间】:2012-06-28 10:19:04
【问题描述】:

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

特别是有一个类经常用于上传图像 - ImageUploader - 它假设触发位于主窗口笔尖并连接到终端控制器的进度指示器。

我的问题是我似乎无法弄清楚如何从 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];
}

【问题讨论】:

    标签: objective-c macos xcode4


    【解决方案1】:

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

    【讨论】:

    • 感谢您的提示。我用过 NSNotifications。它工作完美
    猜你喜欢
    • 1970-01-01
    • 2012-05-18
    • 2023-04-07
    • 2020-11-24
    • 2017-03-22
    • 2019-08-03
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多