2012-01-30 53 views
0

我真的被困在這一個。 我們有一個IAP,其中列表視圖是我們自己的,我們直接指向UADetailView進行購買。因此,我們沒有一個進度條來告訴用戶下載是如何進行的,而且我們的下載量很大。 我以爲我可以使用MBProgressHud,但我遇到了一個問題。我似乎無法將UA的進展傳遞給HUD。如果我使用一個簡單的計數器記錄它,一切正常工作與HUD。很像他們自己的樣本。iOS城市飛艇進展和HUD

這是HUD調用;

- (void)showWithLabelDeterminate { 

HUD = [[MBProgressHUD alloc] initWithView:self.view.window]; 
[self.view.window addSubview:HUD]; 

// Set determinate mode 
HUD.mode = MBProgressHUDModeDeterminate; 

HUD.delegate =self; 
HUD.labelText = NSLocalizedString(@"DownLoading",""); 

// myProgressTask uses the HUD instance to update progress 
[HUD showWhileExecuting:@selector(refreshProgress) onTarget:self withObject:nil animated:YES]; 

}

和我試圖使用刷新;

- (void)refreshProgress:(float)progress { 
    while (progress < 1.0f) 
    NSLog(@"++ progress for HUD: %f", progress); 
    HUD.progress = progress; 

}

然而,當我運行的應用程序崩潰與此日誌...

2012-01-30 12:23:18.838 isengua恩[12730:3827 ] - [UAProductDetailViewController refreshProgress]:無法識別的選擇發送到實例0x3e2c10 2012-01-30 12:23:18.840 isengua烯[12730:3827] *終止應用程序由於未捕獲的異常 'NSInvalidArgumentException' 的,原因是:「 - [UAProductDetailViewContr奧勒 refreshProgress]:無法識別的選擇發送到實例0x3e2c10' *第一擲調用堆棧:(0x30caa8bf 0x37e4f1e5 0x30cadacb 0x30cac945 0x30c07680 0x30c0922b 0xf4e59 0x37cbca91 0x37d505a1 0x36447c1d 0x36447ad8)終止叫做拋出異常[

任何人在那裏,有同樣的問題並解決了它?

更新與chages ...

- (void)showWithLabelDeterminate { 

HUD = [[MBProgressHUD alloc] initWithView:self.view.window]; 
[self.view.window addSubview:HUD]; 

// Set determinate mode 
HUD.mode = MBProgressHUDModeDeterminate; 

HUD.delegate =self; 
HUD.labelText = NSLocalizedString(@"DownLoading",""); 

// myProgressTask uses the HUD instance to update progress 
[HUD showWhileExecuting:@selector(productsDownloadProgress:) onTarget:self withObject:nil animated:YES]; 

}

- (void)productsDownloadProgress:(float)progress count:(int)count { 
    HUD.progress = progress; 
    UALOG(@"[StoreFrontDelegate] productsDownloadProgress: %f count: %d", progress, count); 
    if (count == 0) { 
     NSLog(@"Downloads complete !"); 

    } 
} 

,這對購買按鈕

- (void)purchase:(id)sender { 
self.navigationItem.rightBarButtonItem.enabled = NO; 
[UAStoreFront purchase:product.productIdentifier];   
[self.navigationController popViewControllerAnimated:NO]; 
[[UAStoreFront shared] setDelegate:self]; 
[self showWithLabelDeterminate]; 

}

崩潰日誌:

2012-01-30 13:12:45.555 isengua烯[12886:6e27] - [UAProductDetailViewController productsDownloadProgress:]:無法識別的選擇發送到實例0x3f7f70 2012-01-30 13點十二分45秒。557 isengua恩[12886:6e27] *終止應用程序由於 未捕獲的異常 'NSInvalidArgumentException',原因是: ' - [UAProductDetailViewController productsDownloadProgress:]: 無法識別的選擇發送到實例0x3f7f70' *第一擲調用堆棧:( 0x30caa8bf 0x37e4f1e5 0x30cadacb 0x30cac945 0x30c07680 0x30c0922b 0xf5e21 0x37cbca91 0x37d505a1 0x36447c1d 0x36447ad8)終止叫做拋出異常

+0

你能告訴我們一些細節:你的showWithLabelDeterminate和你的refreshProgress在哪裏。謝謝 – MartinMoizard 2012-01-30 12:41:47

+0

@MartinMoizard我在UAProductDetailViewController.m中有 - - (void)購買激活它 – Jorgen 2012-01-30 12:44:58

回答

1

你刷新進度法需要一個參數(float),因此您的選擇應該有在末尾有一個冒號:

在客觀C,這樣的:

@selector(refreshProgress:) 

是不一樣的:

@selector(refreshProgress) 

他們是不同的方法名稱。

+0

謝謝,這讓我更靠近一步。不幸的是,refreshProgress沒有像應該那樣計時。它保持在0。0 – Jorgen 2012-01-30 13:05:58

+0

你確定(浮點)進度參數是否在那裏?也許你應該以不同的方式獲得進步?它看起來像[HUD showWhileExecuting:@selector(refreshProgress :) onTarget:self withObject:nil animated:YES];方法只是將nil作爲參數傳遞,這意味着函數的進度參數始終爲零。 – 2012-01-30 13:09:05

+0

是的,它似乎沒有做任何事情。還有另一種方法應該記錄下載,但也會崩潰應用程序。 - (void)productsDownloadProgress:(float)progress count:(int)count {HUD.progress = progress; UALOG(@「[StoreFrontDelegate] productsDownloadProgress:%f count:%d」,progress,count); (count == 0){NSLog(@「Downloads Complete completed in LessonListView!」); } } – Jorgen 2012-01-30 13:15:28

0

如果你有一個方法

- (void)productsDownloadProgress:(float)progress count:(int)count 

那麼它的選擇是

productsDownloadProgress:count: 

productsDownloadProgress: 

因此,通過給選擇 「productsDownloadProgress:」 而不是「productsDownloadProgress:計數:「你正在給一個不存在的方法提供一個選擇器。當HUD嘗試調用該選擇器時,Objective-C運行時會在您指定的目標(本例中爲「self」)中查找它,找不到它並引發NSInvalidArgument異常。

即使您修復了無效的選擇器問題,您仍可能仍會遇到麻煩。您的productsDownloadProgress:count:方法需要兩個參數,這兩個參數都是基本類型,但[HUD showWhileExecuting:onTarget:withObject:animated:]方法似乎需要一個只接受一個參數的選擇器,該參數應該是一個Objective-C目的。

這就是withObject:part的用途 - 您給它一個Objective-C對象,它將作爲第一個參數傳遞給該方法。

當然,我對城市飛艇一無所知,所以也許它會正常工作。

1

這裏的崩潰很明顯,並已由尼克和肖恩適當解釋。

更重要的問題是,您正在爲MBProgressHUD應用不正確的使用模式進行下載操作。你應該做的是創建一個hud,並在某種下載進度委託回調中更新它的進度。

您應該看到的示例是https://github.com/jdg/MBProgressHUD/blob/master/Demo/Classes/HudDemoViewController.m#L156,以及以下代表回調https://github.com/jdg/MBProgressHUD/blob/master/Demo/Classes/HudDemoViewController.m#L226