1

GitHubのMBProgressHUDを使用していますが、実行中の進行状況フロートを別のクラスに渡したいと思います。

クラスAの場合:

-(void)methodName
{
    HUD = [[MBProgressHUD alloc] initWithView:self.view];
    [self.navigationController.view addSubview:HUD];
    HUD.mode = MBProgressHUDModeAnnularDeterminate;
    HUD.delegate = self;
    HUD.dimBackground = YES;
    HUD.labelText = @"Loading";
    [HUD showWhileExecuting:@selector(myProgressTask) onTarget:self withObject:nil animated:YES];
}
- (void)myProgressTask
{
    HUD.progress = progress;
}

クラスBの場合:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    expectedLength = [response expectedContentLength];
    currentLength = 0;
    HUD.mode = MBProgressHUDModeDeterminate;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    currentLength += [data length];
    float progress = currentLength / (float)expectedLength;
    NSLog(@"%f", progress);
}

「floatprogress」をクラスBからクラスAのメソッド「myProgressTask」に渡す必要があります

NSLog:

2013-02-27 15:23:14.006 [8209:c07] 0.161726
2013-02-27 15:23:14.329 [8209:c07] 0.253171
2013-02-27 15:23:14.718 [8209:c07] 0.436063
2013-02-27 15:23:15.941 [8209:c07] 0.527508
2013-02-27 15:23:16.230 [8209:c07] 0.618954
2013-02-27 15:23:16.238 [8209:c07] 0.710400
2013-02-27 15:23:16.614 [8209:c07] 0.893291
2013-02-27 15:23:16.615 [8209:c07] 0.984736
2013-02-27 15:23:16.618 [8209:c07] 1.000000

あなたが助けることができることを願っています!前もって感謝します!:)

4

4 に答える 4

1

このメソッドを次のように変更します。

- (void)myProgressTask:(float)progress
{
    HUD.progress = progress;
}

クラスBの変更:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    currentLength += [data length];
    float progress = currentLength / (float)expectedLength;
    NSLog(@"%f", progress);
    ClassA obj = [[ClassA alloc] init]; //Put autorelease if you are not using ARC.
    [obj myProgressTask:progress];
}
于 2013-02-27T13:31:51.153 に答える
0

最善の解決策は、プロトコルを使用することです。ユーティリティアプリケーションのXCode4の例を参照してください

クラスAヘッダーの場合:

@interface ClassA : UIViewController <ClassBDelegate>

@property float yourFloat;

クラスAの実装:

- (void)loadClassB
{
    ClassB *classB = [ClassB new];
    classB.delegate = self; 
}

クラスBヘッダーファイル:

@class ClassB;

@protocol ClassBDelegate
- (void)callbackMethod;
@end

@interface ClassB : UIViewController

@property (weak, nonatomic) id <ClassBDelegate> delegate;



@end

クラスBの実装:

- (void)viewDidLoad
{
    float newFloat = self.delegate.yourFloat; // <- the assignment occurs here
    [self.delegate callbackMethod];
}
于 2013-02-27T13:29:38.300 に答える
0

次のいずれかを使用できます。

  1. 変数をグローバルにする

  2. 静的

  3. シングルトン

  4. 引数として渡す

  5. 通知として投稿します。

こちらを確認してください。

注:新しいプログラマーのためにリストの一番上にあるグローバルは、obj-cに慣れると、どれがいつ最適かがわかります。

于 2013-02-27T13:29:57.310 に答える
0

問題を解決する方法はたくさんあります。Key-ValueObservingを使用します。

のプロパティprogressを作成しClass Bます。次に変更します。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    currentLength += [data length];
    //float progress = currentLength / (float)expectedLength;
    self.progress = currentLength / (float)expectedLength;
    //NSLog(@"%f", progress);
    NSLog(@"%f", self.progress);
}

class A次に、のKey-Value観測に登録しますclassB.progress。の初期化でこれを行うことができますclass A

[classB_object_reference addObserver:self
                          forKeyPath:@"progress"
                             options:NSKeyValueObservingOptionNew
                             context:nil];

このメソッドをに追加しclass Aます:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    //do whatever you want here with the new value of classB_object.progress
}
于 2013-02-27T14:13:03.007 に答える