source

행용 셀:IndexPath: 호출되지 않음

nicesource 2023. 8. 17. 21:25
반응형

행용 셀:IndexPath: 호출되지 않음

내 앱에는 로그인된 상태와 로그인되지 않은 상태의 두 가지 상태가 있으며, 나는 다음과 같은 아키텍처(대단히 단순화됨)를 가지고 있습니다.
검색 상자와 테이블 보기가 포함된 View 컨트롤러 A.
앱 로그인에 사용되는 컨트롤러 B를 봅니다.

흐름은 다음과 같습니다.
사용자가 로그인하지 않았습니다.
A가 스택에 눌려 있습니다.viewWillAppear사용자가 로그인했는지 확인하고, 로그인한 경우 비동기 네트워크 요청을 수행하고 있으며, 요청이 완료되면 테이블에 네트워크의 데이터가 로드됩니다.그러나 사용자가 이 시점에 로그인하지 않았기 때문에 테이블 보기는 비어 있습니다.
사용자가 검색 상자를 탭합니다. 로그인하지 않았기 때문에 (확인 후) B가 푸시됩니다.
한 후 를 다시 ; B는 성 공 로 로 한 인 B를 으 그 A는 누 니 다
에, 이시점서때에, 문로했기인그에서.viewWillAppear비동기 요청을 수행합니다.
그것이 완료되면, 나는 전화합니다.reloadData테이블 뷰에서

내가 주목하는 것은numberOfRowsInSection: 호출되고 결과가 되지만, "는 " "라는 이름으로 표시됩니다.cellForRowAtIndexPath:나중에 호출되지 않으며 테이블은 비어 있습니다.

확인해 봤는데요.reloadData는 메인 스레드에서 호출됩니다.

뭐가 뭔지 알아요?날 미치게 만들거든요!


편집: 다음은 코드의 비동기 비트입니다.viewWillAppear에서.

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픽셀 높이의 첫하지 않은 " " " " ", 20" " "" " " " " 0" " " 을( 를) 반환하지 .viewForHeaderInSection이 경우 행이 표시되지 않고 테이블이 없는 것처럼 보입니다.

IB를 사용하고 있는 것 같습니다.표의 크기는 머리글과 바닥글 크기를 가정하고 있기 때문에 IB에서 기만적일 수 있습니다.애플리케이션이 실행될 때 테이블이 어디에 있는지 이해할 수 있도록 테이블 프레임을 기록합니다(IB에 표시되는 위치와 비교).또한 reloadData를 호출하기 전에 테이블 프레임의 크기를 수동으로 조정하고 위치를 지정해야 합니다.이것은 이 유효한 사례를 해결할 것입니다.cellForRowAtIndexPath호출되지 않았습니다.

다▁that를 확인합니다.numberOfSectionsInTableView0을 .

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

저도 똑같은 문제가 있었는데 다른 스레드에서 reloadData:를 호출하려고 하는 것이 문제였습니다.해결책은 다음과 같습니다.

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

만약 당신이 나처럼 다른 dataSource를 사용하고 있다면, 당신이 dataSource를 유지하고 있는지 확인하세요.될하고 dataSource를 통해 하는 것입니다.tableView.dataSource = myDataClass완료되면 viewDidLoad가 됩니다.다른 모든 방법들이 저를 위해 요구되었습니다. 놀랍게도,heightForRowAtIndexPath디버깅하는 데 시간이 좀 걸렸습니다.

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

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

// False
    ▼ View
        ► Scrool View
            ► Table View
        ► Constraints
// 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;

우리는 같은/비슷한 문제가 있었습니다.가 코드도에 했습니다.numberOfSections그리고.numberOfRowsInSection(을 반환하기도 ) 할 수 없었습니다.cellForRowAt당시 스토리보드의 테이블 뷰에는 오른쪽, 왼쪽 및 위쪽에만 제약 조건이 있었지만 아래쪽에는 제약 조건이 없었습니다.우리가 바닥에 구속력을 더하자, 그것은 매력적으로 작동했습니다.

표 보기에 필요한 모든 제약 조건을 제공하는지 확인합니다.

나처럼 자동 레이아웃을 사용하고 뷰 컨트롤러의 뷰에 테이블 뷰를 추가하는 경우, 테이블 뷰를 할당할 때 이 줄을 추가했는지 확인합니다.

tableView?.translatesAutoresizingMaskIntoConstraints = false

내 쪽에서 바보 같은 실수.

다들 키 얘기만 하는데 저는.TableView순식간에StackView선행 선형이 0 너비로 끝납니다.

다음 항목이 있는지 확인하십시오.TableView를 사용하여 올바른 크기입니다.Debug View Hierarchy.

가 내가추내한문때에다니해습을 한 제 서브뷰 입니다.UITableView에서 할되지않nill을반환테이뷰고않호가를 호출하지 .cellForRowAtIndexPath그렇지만numberOfRowsInSection

몇 시간을 허비한 후 내 테이블 뷰가 스택 뷰 안에 있다는 것을 알게 되었습니다.스택 뷰를 제거하자마자 매력적으로 작동했습니다.저는 Xcode 11.3입니다.

나는 고객 데이터 소스를 사용하고 있는데, 그것이 출시되었습니다.테이블 뷰의 약한 참조이기 때문입니다.

이것은 당황스럽고 당혹스럽지만, 제 해결책은 이렇습니다.

내 코드:

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

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

저의 근본적인 원인은 테이블 출력을 다음과 연결했기 때문입니다.scanResultTable _scanResultTable로 되었습니다.사용하기 시작하면scanResultTable제가 했어야 했던 것처럼, 모든 것이 해결되었습니다.이것은 objective-c가 식별자에서 밑줄을 이끄는 것에 대해 특별한 것이 있는지 의문을 갖게 합니다.

편집: 그렇습니다!세상에, 나는 이 언어를 다시는 만지지 않기를 기다릴 수 없습니다.

저 같은 경우에는.TableView富士山의 StackViewStackView 밖에 놓았을 때 작동했습니다.

- (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]; 
}

저는 리액티브 코코를 사용합니다.그래서 테이블 뷰를 위한 모델을 만들었습니다.데이터가 표시될 준비가 되었습니다.numberOfRows그리고 곧 호출되었습니다.그러나 테이블 뷰를 서브뷰로 추가하지 않아요.cellForRowAtIndexPath불리지 않았습니다)).

이것은 너무 명백할 수도 있지만, 저의 경우 프로그래밍 방식으로 테이블의 상단 여백에 대한 참조인 요소(라벨)를 삭제하고 있었기 때문에 대리자/소스의 문제가 아니라 테이블의 내용 크기/높이에 문제가 있는 경우, 이 충돌로 인해 이상한 동작이 발생했습니다.호출 번호:cellForRowAtindexPath가 아닌 섹션의 행 수

한 후 B가 표시되는 것이 합니까?viewWillAppearA의 메서드가 새로 고침을 수행하기 위해 호출됩니까?

만약 당신이 B를 모달 컨트롤러로 보여준다면, 당신이 그것을 제거할 때 당신은 그것을 가질 수 없을 것입니다.viewWillAppear메서드가 호출되었습니다.

제가아한는,한는▁as,viewWillAppear/viewDidAppear(및 기타 유사 항목)은 탐색 이벤트(푸시/팝업 보기 컨트롤러)의 경우 UINavigation Controller에 의해 생성되는 이벤트입니다.그래서 아마도 그것이 당신이 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];

in dataSource 메서드에서 반환이 증가했습니다.int _rowsNumber:

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

tableViewCell 식별자를 확인하여 동일한 문제를 해결했습니다.특성 검사자로 이동하여 식별자 섹션을 확인합니다.아마도 누락되었을 것입니다.셀 식별자를 작성합니다.

여기도 같은 경우지만, 그건 실수였습니다.

ViewController(설계 요구 사항) 내에 2개의 테이블View가 있는 ScrollView를 포함하고 ScrollView Controller(테이블View 포함)에서 프로그래밍 방식으로 ViewController(TableView 포함)를 생성하여 약한 var를 사용하여 저장했습니다. viewDidLoad 메서드 끝에 릴리스되었기 때문에 좋지 않은 아이디어였습니다.

테이블 뷰 콘텐츠가 표시되지 않으면 릴리스되었는지 확인하십시오.

viewForCell을 제외한 모든 메서드(대리인 및 데이터 소스)가 호출되었기 때문에 저의 실수는 매우 뇌가 아팠습니다.

StackView 및 TableView 스크롤 비활성화 및 높이 제한 설정에서 TableView를 사용한 적이 있지만 그 이후에도 동일한 문제가 있습니다.

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

작동하지 않음 이 메서드 호출을 모두 중지합니다.Data Source그리고.Delegate세팅하다

솔루션이 테이블 뷰 하단, 선행, 후행 제약 조건으로 설정된 것과 동일한 문제가 있는 경우

enter image description here

여기에 있는 어떤 대답도 저에게 도움이 되지 않았습니다.

프로그래밍 방식으로 제약 조건을 수행하는 중이었는데 다음과 같이 쓰는 것을 잊었습니다.

myTableView.translatesAutoresizingMaskIntoConstraints = false

제약 조건이 올바르고 빌드 시에 제거되는 제약 조건이 없는지 확인합니다.

언급URL : https://stackoverflow.com/questions/7712325/cellforrowatindexpath-not-called

반응형