ProgramingTip

cellForRowAtIndexPath : 호출되지 않음

bestdevel 2020. 11. 12. 19:25
반응형

cellForRowAtIndexPath : 호출되지 않음


내 앱에는 로그인 상태와 로그인 안 됨의 두 가지 상태가 다음 아키텍처 (대단히 단순화 됨)
가 있습니다 .- 검색 상자와 테이블보기를 포함하는 ViewController A.-
앱 로그인에 사용되는 ViewController B.

흐름은 다음과 같습니다
.- 사용자가 로그인되지 않았습니다.
-A가 스택에 밀려 있습니다. 에서 viewWillAppear사용자가 예에서와 경우에 로그인하면 내가 확인, 네트워크 요청이 완료, 테이블은 네트워크에서 데이터를로드, 만들어되고있다. 그러나이 시점에서 사용자가 로그인하지 갑자기 기 때문에 테이블보기는 비어 있습니다.
-사용자가 검색 창을 탭합니다. 그가 로그인하지 않아서 B가 푸시됩니다 (확인 후).
-그는 B에 다음으로 로그인 한 다음 B를 팝업하고 A를 다시 표시하는 버튼을 누릅니다.
-이 시점에서 그가 로그인 때문에 viewWillAppear나는 요청을합니다.
-완료되면 reloadData테이블 뷰를 호출 합니다.

내가 알아 차리는 것은 numberOfRowsInSection:호출되고 올바른 결과를 반환하지만 cellForRowAtIndexPath:나중에 호출되지 않고 테이블이 비어 있습니다.

나는 확인 reloadData메인 사운드에서 호출되었습니다.

그게 뭔지 아세요? 날 미치게 만들 거든!

고마워,
S.

편집 : 다음 viewWillAppear은 A 의 뜻 코드 입니다.

if ([User isLoggedIn]) {
    [self.asyncRequest fetchDataWithCompletionHandler:^(id response, NSError *error) {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        if (error) {
            [Utils displayError:error];
        } else {
            self.array = response;

            self.isLoaded = YES;
            [self.tableView reloadData];
            [self.tableView setContentOffset:CGPointMake(0.0f, 0.0f) animated:NO];
        }
    }];
}

요청이 사용 된 메시지로 완료 response되고 올바른 데이터 가 포함 되어 있는지 확인했습니다 (이는 백업하는 데 배열입니다 UITableView).

그 후에 reloadData중단 된 점을 tableView:numberOfRowsInSection:중단하고 올바른 수의 요소를 반환합니다 array. 그러나 그 이후에는 중단되지 tableView:cellForRowAtIndexPath:않습니다.


numberOfRowsInSection호출 호출되지 cellForRowAtIndexPath않는 이유에 대한 한 가지 유효한 시나리오 표시 는 테이블의 크기 또는 위치에 할 행이 필요하지 않은 경우입니다.

예를 들어 높이가 20 픽셀 인 테이블이 있고 첫 번째 섹션의 헤더가 30이고 헤더에 대해 설명하지 않습니다 (또는 구현하지 않는 가정 viewForHeaderInSection). 이 경우 행이 표시되지 않고 테이블이없는 것처럼 표시되지 않습니다.

IB를 사용하고 계십니다. 표의 크기는 머리글 및 바닥 글 크기를 가정하기 때문에 IB에서 기만적 일 수 있습니다. 응용 프로그램이 실행될 때의 위치를 ​​이해할 수있는 테이블의 프레임을 기록합니다 (IB에 표시되는 위치와 비교). 또한 reloadData 호출 하기 전에 테이블 프레임의 크기와 위치를 수동으로 조정해야합니다 . 이것은 cellForRowAtIndexPath유효한 경우 호출되지 않는 것 입니다.


numberOfSectionsInTableView가 0 반환하지 않는지을 확인하십시오 .

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}


나는 똑같은 문제가 같은 문제는 다른 것에서 reloadData : 호출하려고하는 것입니다. 해결책은 다음과 가변합니다.

dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
});

다른 dataSource를 사용하는 경우에는 dataSource를 유지하고 확인하십시오. tableView.dataSource = myDataClasstableView의 dataSource 속성이 약하고 viewDidLoad가 완료 될 때 해제 될 때 dataSource가 될 클래스를 인스턴스화하고이를 통해 할당하는 충분 충분하지 않습니다. 놀랍게도 다른 모든 방법이 나를 위해 호출 한 모든 방법이 나를 위해 호출 된 heightForRowAtIndexPath것이 었습니다.


// For others showing up on this questions via Google, etc.
// Check and make sure you've set the table view's data source and delegate.
self.tableView.dataSource = self;
self.tableView.delegate = self;

Scrool View와 같은 것과 충돌하는 뷰 내부의 테이블 뷰는 호출되지 않습니다. 스토리 보드 또는 * .xib 파일에서보기를 분리해야합니다.

// True
    ▼ View
        ► Table View
        ► Scrool View
        ► Constraints

// False
    ▼ View
        ► Scrool View
            ► Table View
        ► Constraints

모두가 높이에 대해 계속 이야기하지만, 선행 정렬의 TableView에서 계속 이야기 StackView합니다.

TableView사용하여 올바른 크기 인지 확인하십시오 Debug View Hierarchy.


이것은 당황스럽고 당혹 스럽지만 여기에 내 해결책이 있습니다.

내 코드 :

_scanResultTable.delegate = self;
_scanResultTable.dataSource = self; // self's lifecycle was fine, wasn't getting released
[_scanResultTable reloadData];

그래서 이상한 부분은 : _scanResultTable 식별자는 프로젝트의 어느 곳에서도 내 코드에서 선언되지 않았습니다. 나는 이것이 어떻게 컴파일되었는지 전혀 모른다 (그리고 나는 여러 번 재 컴파일했다).

내 근본 원인은 내 테이블 출력을 scanResultTable내 ViewController에 연결했지만 _scanResultTable로 참조했기 때문입니다. 내가 당연한 scanResultTable것처럼 사용하기 시작하면 상황이 해결되었습니다. 이것은 Objective-c가 식별자의 밑줄에 대해 특별한 무언가를 가지고 있는지 궁금하게 만듭니다.

편집 : 그렇습니다 ! 주님,이 언어를 다시는 건드리지 않기를 기다릴 수 없습니다.


내 하위 뷰가있는 내가이 추가 때문에이 문제를 해결 UITableView이 빈 채로 돌아되고있는 tableview가 호출되지 않도록 할당되지 않은 cellForRowAtIndexPath있지만 numberOfRowsInSection라고하기


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Make sure self.data isn't nil!
    // If it is, you'll always return 0 and therefore
    // cellForRowAtIndexPath will never get called.
    return [self.data count]; 
}

고객 데이터 소스를 사용 중이며 릴리스되었습니다. 그것은 tableview의 약한 참조이기 때문입니다.


ReactiveCocoa를 사용하고 있습니다. 그래서 저는 테이블 뷰를위한 모델을 만들었습니다. 데이터를 표시 할 준비가 numberOfRows되었기 때문에 호출되었습니다. 하지만 테이블 뷰를 하위 뷰로 추가 cellForRowAtIndexPath하지 않았으므로 호출되지 않았습니다.)))


나와 같은 자동 레이아웃을 사용하고 테이블 뷰를 뷰 컨트롤러의 뷰에 추가하는 경우 테이블 뷰를 할당 할 때이 행을 추가했는지 확인하십시오.

tableView?.translatesAutoresizingMaskIntoConstraints = false

내 쪽에서 어리석은 실수.


사용자가 로그인하고 B가 팝업 된 viewWillAppear후 새로 고침을 수행하기 위해 A 메서드가 호출 되는지 확인 합니까?

B를 모달 컨트롤러로 표시하면 닫을 때 viewWillAppear메서드가 호출 되지 않습니다 .

내가 아는 한 viewWillAppear/viewDidAppear(및 이와 유사한 기타) 탐색 이벤트 (푸시 / 팝 뷰 컨트롤러)의 경우 UINavigationController에 의해 생성 된 이벤트입니다. 그래서 아마도 A를 떠났다가 돌아올 때 결국 새로 고침을받는 이유 일 것입니다. 모든 것은 다음 뷰 컨트롤러를 표시하는 방법에 달려 있습니다.


대신 새 행을 수동으로 삽입하십시오 [self.tableView reloadData].

[self.tableView beginUpdates];
    for (int i = 0; i < responseArray.count; i++) {
        _rowsNumber += 1;
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
        [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];
    }
[self.tableView endUpdates];

dataSource 메소드에서 증분 반환 int _rowsNumber:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _rowsNumber;
}

tableViewCell 식별자를 확인하여 동일한 문제를 해결했습니다. 속성 İnspector로 이동하여 식별자 섹션을 봅니다. 아마도 누락되었습니다. 따라서 셀 식별자를 작성하십시오.


여기서도 같은 경우이지만 실수였습니다.

나는의 ViewController 내부 2 tablesViews (설계 요구 사항)과 함께있는 ScrollView를 포함는있는 ScrollView 컨트롤러에서 나는 프로그래밍 방식 ViewControllers을 (즉, TableViews를 포함) 생성 내가 사용 약한 VAR를 보관하기 위해, 나쁜 생각 들이이 말에 출시 되었기 때문에 viewDidLoad 메서드.

Tableview 콘텐츠가 보이지 않으면 출시되었는지 확인하세요.

viewForCell을 제외한 모든 메서드 (delegate & datasource)가 호출 되었기 때문에 내 실수는 저에게 매우 고통 스러웠습니다.


동일한 문제가 있습니다. StackView 내부에서 Table View를 사용하고 테이블 뷰 스크롤을 사용하지 않고 높이 제한을 설정했지만 그 후에는

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

작동하지 않음이 메서드를 모두 호출하는 것을 중지 Data Source하고 Delegate올바르게 설정하십시오.

Solution is set Table View bottom, lead, trailing constrain과 동일한 문제가있는 경우

여기에 이미지 설명 입력


여기에 나온 답변 중 어느 것도 나를 도왔습니다.

프로그래밍 방식으로 제약 조건을 사용했지만 작성하는 것을 잊었습니다.

myTableView.translatesAutoresizingMaskIntoConstraints = false

제약 조건이 정확하고 빌드시 제거되지 않는지 확인하십시오.

참고 URL : https://stackoverflow.com/questions/7712325/cellforrowatindexpath-not-called

반응형