2012-06-17 77 views
0

在我的應用程序中,我有一個tableview。每個單元格包含一個UIButton,UIImageView和一個UILabel。當點擊按鈕時,將使用ASINetworkQueue下載一組文件,此時該按鈕將被替換爲UIProgressView。在下載過程中,如果我滾動表格,應用程序崩潰。而我得到的ASIHTTPRequest.m類的錯誤點,UITableViewCell中的UIProgressbar問題

+ (void)updateProgressIndicator:(id *)indicator withProgress:(unsigned long long)progress ofTotal:(unsigned long long)total 
{ 
    #if TARGET_OS_IPHONE 
     // Cocoa Touch: UIProgressView 
     SEL selector = @selector(setProgress:); 
     float progressAmount = (float)((progress*1.0)/(total*1.0)); 

    #else 
     // Cocoa: NSProgressIndicator 
     double progressAmount = progressAmount = (progress*1.0)/(total*1.0); 
     SEL selector = @selector(setDoubleValue:); 
    #endif 

    if (![*indicator respondsToSelector:selector]) { // here i am getting the error 
     return; 
    } 

    [progressLock lock]; 
    [ASIHTTPRequest performSelector:selector onTarget:indicator withObject:nil amount:&progressAmount callerToRetain:nil]; 
    [progressLock unlock]; 
} 

這裏是我的代碼: 我寫了一個UITableViewCell類,像,

@interface UIMenuItemCell : UITableViewCell{ 
    UILabel *cellItemName; 
    UIImageView *cellitemImage; 
    UIButton *cellItemButton; 
    UIProgressView *cellItemProgress; 
} 
@property (nonatomic, retain) UILabel *cellItemName; 
@property (nonatomic, retain) UIImageView *cellitemImage; 
@property (nonatomic, retain) UIButton *cellItemButton; 
@property (nonatomic, retain) UIProgressView *cellItemProgress; 

- (UIMenuItemCell *) getCellContentView:(NSString *)cellIdentifier { 

    CGRect CellFrame = CGRectMake(0, 0, 150, 60); 
    CGRect imgFrame = CGRectMake(20, 48, 110, 123); 
    CGRect btnFrame = CGRectMake(25, 140, 100, 26); 

    UIImageView *itemImg; 
    UIButton *itemBtn; 

    UIMenuItemCell *cell = [[UIMenuItemCell alloc] init] ; 
    cell.frame = CellFrame; 

    //Initialize ImageView 
    itemImg = [[UIImageView alloc]initWithFrame:imgFrame]; 
    itemImg.tag = 2; 
    [cell.contentView addSubview:itemImg]; 

    //Initialize Button 
    itemBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    itemBtn.frame = btnFrame; 
    itemBtn.tag = 3; 
    itemBtn.titleLabel.textColor = [UIColor blueColor]; 
    itemBtn.titleLabel.font = [UIFont systemFontOfSize:9.0]; 
    [cell.contentView addSubview:itemBtn]; 

    return cell; 
} 
// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UIMenuItemCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if(cell == nil) 
     cell = [self getCellContentView:CellIdentifier]; 

    cell.cellitemImage = (UIImageView *)[cell viewWithTag:2]; 
    cell.cellItemButton = (UIButton *)[cell viewWithTag:3]; 

    DataBaseClass *itemObj = [appDelegate.itemArray objectAtIndex:indexPath.row]; 
    NSString *url; 
    if ([itemObj.itemStatus isEqualToString:@"NotAvailable"]) { 
     url = [NSString stringWithFormat:@"%@",itemObj.notAvialableIcon]; 
     [cell.cellItemButton setTitle:date forState:UIControlStateNormal]; 
     cell.cellItemButton.userInteractionEnabled = NO; 
     cell.userInteractionEnabled = NO; 
     [cell.cellItemButton setBackgroundImage:[UIImage imageNamed:@"not_available_bttn_bck_img"] forState:UIControlStateNormal]; 
    }else if([itemObj.itemStatus isEqualToString:@"Available"]){ 
     cell.cellItemButton.userInteractionEnabled = YES; 
     cell.userInteractionEnabled = YES; 
     [cell.cellItemButton setTitle:@"" forState:UIControlStateNormal]; 
     [cell.cellItemButton setBackgroundImage:[UIImage imageNamed:@"img_normal"] forState:UIControlStateNormal]; 
     [cell.cellItemButton setBackgroundImage:[UIImage imageNamed:@"img_pressed"] forState:UIControlStateHighlighted]; 
     [cell.cellItemButton addTarget:self action:@selector(download) forControlEvents:UIControlEventTouchUpInside]; 
     url = [NSString stringWithFormat:@"%@",itemObj.availableIcon]; 
    } 

    [cell.cellitemImage setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"item01.png"]]; 

    cell.cellItemName.text = [NSString stringWithFormat:@"%@",itemObj.itemName]; 

    return cell; 
} 

和下載操作:

- (void)download{ 
//adding custom method to add the uiprogressview into the selected cell 
//and setting the progress delegate for the queue 
[self.myQueue setDownloadProgressDelegate:currentProgress]; 
//then starts download 
[self.myQueue go]; 
} 

請分享你的想法。 編輯:在這裏,我在同一時間實施多個下載。

回答

1

正在發生的事情是,當你的電池超出屏幕的進度條得到釋放和ASI將嘗試更新一個釋放的對象,你所要做的就是將二者彼此分開,你可以創建一個下載器類,讓這個類將通知發送到電池,請注意,這將需要一些工作在你的身邊,祝你好運:)

+0

不錯的建議,但正如你所說,它需要更多的工作。那麼你可以給任何教程或示例代碼來實現這個? – Mithuzz

1

@Omar是有關該問題的正確。下面是一個解決方案的草圖:

添加一個屬性,如「downloadProgress」到DatabaseClass。這可以是一個浮動,當下載沒有發生時,誰的值是負值,下載正在發生時是0.0到1.0。

將隱藏的進度指示器添加到您的自定義單元格中。

當按下下載按鈕,得到相應的數據庫項目,並開始下載(設置項目的downloadStatus爲0.0)。當你從異步進程中獲得進展時,更新該項目的downloadStatus。

每次你這樣做,讓表知道狀態改變時(NSNotification可能是一個很好的機制在這裏)。表VC應該調用reloadRowsAtIndexPaths:用包含數據庫項目對應的索引路徑的數組。

配置單元格時,表格VC應檢查項目的下載狀態。如果是肯定的,取消隱藏狀態指示器並根據浮動狀態設置進度。

此外,關於崩潰:它看起來像有一個在的UpdateProgress方法,其中的指標類型(ID *)至少一個其他的問題。這就像一個指向id的指針,幾乎肯定不是你想要的。只需使用id,並且不要將body中的指示符稱爲*指示符。

+0

第二個選項不起作用,讓我試試第一個。 – Mithuzz