2013-12-26 4 views
0

У меня есть table view с пользовательскими ячейками. Каждая пользовательская ячейка имеет scroll view, в которой изображения добавляются последовательно. Изображения имеют довольно большой размер. Помимо изображений, в каждой ячейке также присутствуют некоторые другие данные. Я сохраняю изображения до db перед повторной загрузкой таблицы. Проблема заключается в том, что tableview reloaddata постоянно звонит, и мой просмотр прокрутки внутри ячейки работает неправильно. Каков эффективный метод перепросмотра табличного представления, не влияя на прокрутку внутри. Кадры также должны загружаться надлежащим образом.UITableView перезагрузка данных объектив c

это, как им вызова этих методов:

-(void)viewWillAppear:(BOOL)animated{ 
[self performSelectorInBackground:@selector(getPacksdetails) withObject:nil];} 

-(void) getPacksdetails 
{ 
    //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    ForcePackRequest *request = [[ForcePackRequest alloc] init]; 
    User *userObj = (User *)[request getActiveUser]; 
    NSString *emailString =[NSString stringWithFormat:@"%@", userObj.Email ]; 

    BOOL isPackList= [request getPurchasedPacksOfUser:emailString toArray:packsListArray excerciseArray:excercisesArray recommendedGearsArray:recommendedGears]; 
    // NSMutableArray *namesArray=[[NSMutableArray alloc]init]; 

    for(int packscounter=0;packscounter<[packsListArray count];packscounter++){ 

     if([[[packsListArray objectAtIndex:packscounter]objectForKey:@"name"] isEqualToString: passedPackName]){ 
      //nslog(@"passedPackName%@",passedPackName); 
      ////nslog(@"%@",data.exName); 
      reservedIndexPath=nil; 

      reservedIndexPath= [NSIndexPath indexPathForRow:0 inSection:packscounter]; 
      //nslog(@"%@",reservedIndexPath);; 
      break; 
     } 
     // reservedIndexPath=[NSIndexPath indexPathWithIndex:i]; 
    } 

    if(isPackList) 
     [self performSelectorInBackground:@selector(loadExerthumbThread:) withObject:nil]; 
} 
- (void) loadExerthumbThread:(id)sender{ 
     //if (FP_DEBUG) //nslog(@"%@",excercisesArray); 
     for(int i=0;i<[excercisesArray count];i++){ 
      NSMutableArray *exforAsection=[[NSMutableArray alloc]init]; 
      // exerciseArrayForeachSection=[excercisesArray objectAtIndex:i]; 

      exforAsection=[excercisesArray objectAtIndex:i]; 
      for (int intConter = 0; intConter <[exforAsection count]; intConter++) 
      { 
       Exercise *data = [exforAsection objectAtIndex:intConter]; 
       // NSString *imageName = [[data.exImage ] intValue]; 

       int intExerId = [data.exImage intValue]; 

       NSString *imagestr = [NSString stringWithFormat:@"hires_%d",intExerId]; 

       FileManager *objFileManager = [[FileManager alloc] init]; 
       NSData *imageData = nil; 
       if ([objFileManager isFileExistsInDocDir:imagestr]) 
       { 
        imageData = [objFileManager getFileFormDocDirWithName:imagestr]; 
       } 
       else 
       { 
        NSString *imageUrlString = [NSString stringWithFormat:@"http://www.forcetherex.com/force_uploads/exercise/exercise_hires/%@.png",data.exId]; 
        NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageUrlString]]; 
        if (data != nil) 
        { 
         if ([data length] > 100) 
          imageData = [data copy]; 
        } 
        if (imageData != nil){ 
         [objFileManager writeFileToAppDirectoryWithFileName:imagestr andFileData:imageData];        
         //Mark as dont back up 
         NSURL *fileUrl = [NSURL fileURLWithPath:imagestr]; 
         [self addSkipBackupAttributeToItemAtURL:fileUrl]; 
         fileUrl=nil; 
         data = nil; 
        } 
       } 
       if (imageData != nil) 
        data.exThumbImage = imageData; 
       objFileManager = nil; 
      } 
      [self reloadTableView]; 
    } 

и мой cellforrow код atindexpath является:

{ 
NSString *CellIdentifier = [NSString stringWithFormat:@"%d_%d",indexPath.section,indexPath.row]; 

       //static NSString *CellIdentifier = @"CustomCellFor_Dashboard"; 
       _customCell = (CustomCellFor_Dashboard *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
       if (_customCell == nil) { 
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellFor_Dashboard" owner:self options:nil]; 
        for (id currentObject in topLevelObjects){ 
         if ([currentObject isKindOfClass:[UITableViewCell class]]){ 
          _customCell = (CustomCellFor_Dashboard *) currentObject; 
          _customCell.delegate=self; 
          break; 
         } 
        } 
       } 

       _customCell.exNameDictArray=[[packsListArray objectAtIndex:indexPath.section]objectForKey:@"exerciseList"]; 
       _customCell.indexPath=indexPath; 
       NSLog(@"%d",sng.showingPath.section); 
       if(indexPath.section ==sng.showingPath.section) 
        _customCell.exnameTable.hidden=FALSE; 

       sectionInt=indexPath.section; 

       exerciseArrayForeachSection=[[NSMutableArray alloc]init]; 

       //[exerciseArrayForeachSection removeAllObjects]; 
       exerciseArrayForeachSection=[excercisesArray objectAtIndex:indexPath.section]; 

       //next btn 
       UIButton *accessoryView = [[UIButton alloc] initWithFrame: _customCell.nextBtn.frame]; 
       accessoryView.tag = indexPath.section; 
       [accessoryView setImage:[imageasArr objectAtIndex:0]forState:UIControlStateNormal]; 

       [accessoryView addTarget:self action:@selector(nextButtonAction:) forControlEvents:UIControlEventTouchUpInside]; 
       [_customCell addSubview:accessoryView]; 
       //_customCell.accessoryView = accessoryView; 

        //prev btn 
        UIButton *prevBtn = [[UIButton alloc] initWithFrame: _customCell.prevBtn.frame]; 
        prevBtn.tag = indexPath.section; 
        [prevBtn setImage:[imageasArr objectAtIndex:2]forState:UIControlStateNormal]; 

        [prevBtn addTarget:self action:@selector(previousButtonAction:) forControlEvents:UIControlEventTouchUpInside]; 
        [_customCell addSubview:prevBtn]; 

       _customCell.selectionStyle = UITableViewCellSelectionStyleNone; 

       [_customCell addSubview:_customCell.buttonView]; 
       _customCell.nameLabel.text=[[packsListArray objectAtIndex:indexPath.section]objectForKey:@"name"]; 

       _customCell.exCountLbl.text=[NSString stringWithFormat:@"%@", [[packsListArray objectAtIndex:indexPath.section]objectForKey:@"exercises"]]; 

       _customCell.scroll.delegate = self; 

       // [_customCell.scroll setBackgroundColor:[UIColor blackColor]]; 
       [_customCell.scroll setCanCancelContentTouches:NO]; 

       _customCell.scroll.indicatorStyle = UIScrollViewIndicatorStyleWhite; 
       _customCell.scroll.clipsToBounds = YES; 
       [_customCell.scroll setContentOffset:CGPointMake(0, 20)]; 

       if([exerciseArrayForeachSection count]>0){ 
        _customCell. scroll.frame = CGRectMake(0,40, 320, _customCell.scroll.frame.size.height-10); 

        _customCell. scroll.contentSize = CGSizeMake(320*[exerciseArrayForeachSection count],_customCell .scroll.frame.size.height); 
        int cx = 30; 
        for(int i=0;i<[exerciseArrayForeachSection count];i++){ 
         Exercise *data = [exerciseArrayForeachSection objectAtIndex:i]; 
         UIView *detailView=[[UIView alloc]initWithFrame:_customCell.excerciseDetailsView.frame]; 

         UILabel *titleLbl=[[UILabel alloc]initWithFrame:_customCell.exTitleLabel.frame]; 
         titleLbl.font=[UIFont systemFontOfSize:12]; 

         UIImageView *exerciseImg=[[UIImageView alloc]initWithFrame: _customCell.exThumbImageView.frame]; 


         UIButton *playBtn=[[UIButton alloc]initWithFrame:_customCell.exThumbButton.frame]; 
         playBtn.showsTouchWhenHighlighted=YES; 

         [playBtn setImage:[imageasArr objectAtIndex:1]forState:UIControlStateNormal]; 

         // playBtn.frame =_customCell.exThumbButton.frame; 
         playBtn.tag=i; 

         [playBtn addTarget:self action:@selector(videoPlayActn:) forControlEvents:UIControlEventTouchUpInside]; 

         [titleLbl setText:data.exName]; 

         if ([data.exThumbImage length] > 0) 
          [exerciseImg setImage:[UIImage imageWithData:data.exThumbImage]]; 


         [detailView addSubview:titleLbl]; 

         [exerciseImg addSubview: playBtn]; 
         [detailView addSubview:exerciseImg]; 
         // _customCell.exThumbButton= playBtn; 
         [exerciseImg bringSubviewToFront:playBtn]; 
         exerciseImg.userInteractionEnabled=TRUE; 
         [detailView bringSubviewToFront:playBtn]; 
         //if (FP_DEBUG) //nslog(@"%f",_customCell.scroll.frame.origin.x); 
         detailView.frame=CGRectMake(cx, 30, 320, _customCell.scroll.contentSize.height); 
         //_customCell.exThumbImageView=exerciseImg; 
         [_customCell.scroll addSubview:detailView]; 
         detailView=nil; 
         exerciseImg=nil; 
         titleLbl=nil; 
         _customCell.scroll.contentSize = CGSizeMake(cx,_customCell.scroll.contentSize.height); 
         cx = cx+_customCell.scroll.frame.size.width; 

         //if (FP_DEBUG) //nslog(@"%i",cx); 
        } 
       } 
       // [_customCell.scroll setContentOffset:CGPointMake(0, 20)]; 

       //if (FP_DEBUG) //nslog(@"%f",_customCell.scroll.contentOffset.x); 

       [_customCell.howyoulfeelBtn addTarget:self action:@selector(buttonclicked:) forControlEvents:UIControlEventTouchUpInside]; 

       [_customCell.expertAdviceBtn addTarget:self action:@selector(expertbuttonclicked:) forControlEvents:UIControlEventTouchUpInside]; 

       [_customCell.recoverTrackerBtn addTarget:self action:@selector(recoverytrackerBtnclicked:) forControlEvents:UIControlEventTouchUpInside]; 

       [_customCell.recommendedGearsBtn addTarget:self action:@selector(recommendedGearsBtnClicked:) forControlEvents:UIControlEventTouchUpInside]; 

       ////nslog(@"ewfewr************ewr"); 

       if(indexPath.section== expandViewclickedSection&&_isexpanded==TRUE){ 

        _customCell.scroll.frame = CGRectMake(-160, 22, self.view.frame.size.width, self.view.frame.size.height); 
        _customCell.shareView.hidden=FALSE; 
        //    _customCell.nextBtn.hidden=TRUE; 
        accessoryView.hidden=TRUE; 
        //_isexpanded=TRUE; 
       } 
       else if(indexPath.section== expandViewCollapsedSection&&_isexpanded==FALSE) { 

        _customCell.scroll.frame = CGRectMake(-0, 22, self.view.frame.size.width, self.view.frame.size.height); 
        _customCell.shareView.hidden=TRUE; 
        // _isexpanded=FALSE; 
       } 
       if(_isExListingTablePresented==TRUE&&indexPath.section==exlistTableAddedSection){ 

        _customCell.exListingTable.hidden=FALSE; 
           } 
       else if(_isExListingTablePresented==FALSE&&indexPath.section==_exlistTableremovedSection){ 
        _customCell.exListingTable.hidden=TRUE; 
            }      
       return _customCell; 
} 
+0

Вы можете показать код в методе настройки ячейки. –

+0

@CharanGiri sure.Edited в вопросе. Его немного сложно, так как у меня много данных. –

+0

Взгляните на http://stackoverflow.com/questions/18223527/uiscrollview-within-uitableviewcell-and-maintaining-scrollview-page – san

ответ

0

Прежде всего переложить весь код, связанный с БД/IO вызовы на другой контроллер и сделать асинхронные вызовы на это и вернуть результат с помощью делегирования методов (или что-нибудь еще, что вы сочтете нужным). Это улучшит общую производительность вашего кода, и просмотр прокрутки будет работать нормально.

В случае, если это не делает вещи идеальными, поместите вызовы DB/IO внутри нового потока, что гарантирует, что ваш просмотр прокрутки (и ваше приложение в целом) отлично работает.

+0

проверить мой отредактированный код. Все это вызовы в потоке. –

0
  1. Вы должны обновить интерфейс в основной теме.

    [self performSelectorOnMainThread: reloadTableView withObject: nil waitUntilDone: NO];

  2. Вы не должны перезагружать таблицу с такой высокой частотой, это замедлит ваше приложение, если в ячейках слишком много содержимого. Попробуйте перезагрузить таблицу после обновления всех данных. Из источника обновление данных должно выполняться в фоновом потоке.

  3. Я вижу, что вы установили идентификатор ячейки с номером строки и раздела, чтобы вы могли с ней сделать какие-то трюки. Как сравнение URL-адресов изображения, чтобы решить, будет ли setImage (это будет стоить много производительности) или нет.
+0

Я попытался перезагрузить таблицу после того, как все данные загружены. Но для отображения ячеек на представлении таблицы требуется много времени. –

+0

Позвольте мне угадать, вы не делаете cellForRowAtIndexPath в heightForRowAtIndexPath, правильно? – LeverkusenFan

Смежные вопросы