0

나는이 모든 작업을 쉽게 수행 할 수있는 방법이 있다는 것을 확신합니다. 나는 매우 피곤합니다. 사과하면 사과하십시오.NSFetchedResultsChangeMove가 사용자 지정 UITableViewCell의 잘못된 레이블을 표시하는 중

내 응용 프로그램에서 NSFetchedResultsController를 사용하고 있습니다. 매우 표준적인 문제입니다. 사용자가 첫 번째 섹션에서 셀을 탭하면 (두 섹션을 만드는 속성의 BOOL 값이 반대로 됨) 두 번째 섹션 (BOOL 값이 다시 반전 됨)으로 이동하고 그 반대의 경우도 마찬가지입니다. .. 좋아, 유명한 작품.

여기 내 구현이 조금 재미있어졌습니다. 결국 iAds를 지원하고 싶습니다 - HIG에 따르면 이들은 화면의 맨 아래에 위치해야합니다 ... 내가 이것을 발견 한 가장 쉬운 방법은 UIView 안에 UITableView를 놓아서 지금 당장 벗어나는 논리적 인 이유를 피하는 것입니다 -하지만 그건 내가 가진거야 - UIView와 UITableView.

프로토 타입 셀이있는 스토리 보드를 사용하고 있습니다. 구체적으로 2 개가 나와 있습니다. 하나는 내용을 추가하는 데 사용되며 두 섹션 사이의 구분 기호로 사용됩니다. 다른 하나는 표시 할 기본 셀입니다. 이 셀에 대해 IBOutlet을 등록 할 때 예외가 발생합니다 (문제가되지만이를 해결할 수 있습니다).

NSArray *cellSubViews = cell.contentView.subviews; 
if ([cellSubViews count] == 3) { 
    // editing accessory view 
    cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    // default background image view 
    cell.backgroundView = self.defaultClockCellBackgroundImageView; 

    // clock name label 
    UILabel *clockNameLabel = [cellSubViews objectAtIndex:2]; 
    clockNameLabel.text = clock.name; 
    clockNameLabel.textColor = (indexPath.section == 0 && ![clock.isAddClockCell boolValue]) 
    ? [UIColor whiteColor] 
    : [UIColor lightTextColor]; 

    // view child button 
    UIButton *viewChildButton = [cellSubViews objectAtIndex:0]; 
    UIImage *viewChildClocksButtonBackgroundImage; 
    if (self.clockForFetch != nil) { 
     //NSLog(@"child clocks list - N/A"); 
     viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"childcell_blank"]; 
     viewChildButton.enabled = NO; 

    } else if ([clock.childClocks count] < 2) { 
     //NSLog(@"add child button"); 
     viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_addchild"]; 

    } else if (![clock.isRunning boolValue] 
       || [self totalChildClocksRunning:clock] < 1) { 
     //NSLog(@"view child button"); 
     // children clocks cannot be running while parent is stopped; 
     // therefore, no need to actually check 
     // this solves the "wait for cell animation to end" issue 
     // without the need for tableview reload data 
     viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_viewchild"]; 

    } else { 
     //NSLog(@"view child running button"); 
     viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_viewchild_running"]; 

    } 
    [viewChildButton setImage:viewChildClocksButtonBackgroundImage forState:UIControlStateNormal]; 
    viewChildButton.hidden = NO; 

    // view time entries list for clock 
    UIButton *detailDisclosureButton = [cellSubViews objectAtIndex:1]; 
    UIImage *detailDisclosureButtonBackgroundImage = (self.clockForFetch == nil) 
    ? [UIImage imageNamed:@"parentcell_detaildisclosure"] 
    : [UIImage imageNamed:@"childcell_detaildisclosure"]; 
    [detailDisclosureButton setImage:detailDisclosureButtonBackgroundImage 
          forState:UIControlStateNormal]; 
    detailDisclosureButton.hidden = NO; 

    if (self.editing) { 
     viewChildButton.hidden = YES; 
     detailDisclosureButton.hidden = YES; 
    } 
} 

주의 사항 : 그래서, 대신, 제가 요소에 도착 cell.contentView.subviews을 사용하고 봤는데 내가 엉망으로 필요 이전에이 방법에 내가 IBOutlets와 별도의 펜촉을 사용했다 문제를 그대로 반복 할 수 있습니다.

다음은 도청되었을 때 움직이는 세 개의 셀이있는 표입니다 (알파, 베타 및 감마). 아, 새로운 이미지가 없습니다. 미안합니다. 이미지를 업로드하기 전에 내게 말했으면 좋겠다. ASCII 아트를 입력하십시오. 다음은

--------------- 
| alpha | 
--------------- 
| beta  | 
--------------- 
| gamma | 
--------------- 
| *delimiter* | 
--------------- 

은 알파와 베타 세포 태핑 후의 테이블 : I는 "베타"로 표시된 제 셀에 지정 세부 개시 버튼을 탭하면,

--------------- 
| gamma | 
--------------- 
| *delimiter* | 
--------------- 
| beta  | 
--------------- 
| beta  | 
--------------- 

그러나이 (어느 읽어야 알파), 세부 뷰로 전달 된 올바른 개체 얻을 :

-------------------------------------------- 
| < back detail view for alpha  edit | 
-------------------------------------------- 

그래서 가져온 결과 컨트롤러가 업데이트되고 있습니다. 테이블보기와 대화 할 때 일관되게 구성하지 않는 것처럼 보입니다. 위의 셀 구성 방법에서는 컨트롤러에서 발견 된 개체의 이름을 확인했습니다. 또한 올바른 것입니다. 즉, 표보기가 베타를 표시하더라도 첫 번째 베타 셀 (색인 경로 1,0에있는 행에 대한 셀)은 알파 - 베타가 아닙니다.

setNeedsDisplay 및/또는 setNeedsLayout을 필요로하는 사용자 정의 셀에 대한 언급이 계속 나오지만 코드에 대해 생각할 수있는 거의 모든 곳에서 퍼팅을 시도했지만 그 중 하나를 이해하고 있다고는 생각하지 않습니다. "NSFetchedResultsChangeMove"는 사용자가 셀을 누를 때 호출되는 것입니다. 웹에서 보았던 많은 유사 콘텐츠를 사용하여 유사하다고 생각되는 결함을 수정했습니다. 아무 소용이 없습니다.

나는이 구조가 시간이 지남에 따라 성숙해질 것이라고 확신하지만, 내가 말했듯이 완전히 다른 구조 (스토리 보드는 당시 존재하지 않았다)로 동일한 문제가 발생했다. 여전히 문제를 반복 할 수 있습니다.

도움을 주시면 감사하겠습니다. 그리고 똑같은이 문제에 대해 여기에 답이 있다면, 나는 그 사과를 사과합니다.

+0

Ps. iTunes U의 Standford 클래스에는 Fetched Results Controller Table View Controller라는 것이 있습니다 ... 관리되는 객체 컨텍스트에서 자동 업데이트가 일시 중단되는 것과 관련된 몇 가지 방법이 있습니다. 이것이이 문제와 관련이 있는지 궁금합니다. 그러나, Objective-C에서 객체 상속에 익숙하지 않은 것을 확인하는 방법을 알지 못한다. –

답변

0

그래서 여기에 내가 문제를 해결하기 위해 한 것이 있습니다. 문제에 대해 생각할 수있는 두 가지 기여자가 있습니다. 다른 사람들이 동일한 상황에 처했을 때 도움이되기를 바랍니다.

  1. 나는 두 개의 다른 프로토 타입 셀을 가지고 있습니다 : 기본 셀과 구분 기호 셀. 따라서 인덱스 경로에서 직접 configure cell을 호출하면 예기치 않은 결과가 발생할 수 있습니다. 따라서 어느 곳에서나 configureCell atIndexPath를 호출했을 수도 있으므로 대신 cellForRowAtIndexPath를 호출했습니다. 셀을 통해 행진

    case NSFetchedResultsChangeUpdate: 
        //NSLog(@"NSFetchedResultsChangeUpdate"); 
        [self.TJTableView cellForRowAtIndexPath:indexPath]; 
        break; 
    
  2. : 일반적으로 인덱스 경로에 행의 셀을 구성 부르고있다 - 예를 들어, 내 가져온 결과 컨트롤러 업데이트 테이블 방법에서, 나는 (특히 변경 업데이트의 경우 대신 cellForRowAtIndexPath를 호출하는 모든 변경 콘텐츠 뷰를 사용하여 하위 뷰를 사용하는 것은 그 자체를 유지하는 것처럼 보이지 않으며 일을하는 데 매우 우아한 방법이 아니므로 UITableViewCell을 여기에있는 교육용 문서 당 사용자 정의 셀로 서브 클래 싱했습니다. - http://bit.ly/oI2GGW -이 방법으로 IBOutlet을 연결하고 구성 경로에서 레이블 및 버튼을 직접 참조하십시오.