program story

뒤로 이동할 때 UITableView를 다시로드 하시겠습니까?

inputbox 2021. 1. 10. 17:14
반응형

뒤로 이동할 때 UITableView를 다시로드 하시겠습니까?


나는 최고 레벨이 UIViewController포함되어 있습니다 UITableView. 최상위 수준 UIViewController은를 인스턴스화하고 NavigationController다른 UIViewController것을 NavigationController. IE는 새로운 두 번째 관점으로 밀어 붙입니다. 이 두 번째보기에는 왼쪽 상단 모서리에 일반적인 "뒤로"버튼이있어 최상위보기로 돌아갈 수 있습니다.

두 번째보기에서 최상위보기로 돌아갈 때 두 번째보기에서 UITableView생성 된 데이터를 사용하여 최상위보기에서 다시 그릴 cellForRowAtIndexPath수 있습니까? 최상위 수준에서 호출 하면 어떻게합니까?


해야 할 일은 이것뿐입니다 (UITableView가있는 UIViewController에서). 이 시점에서 셀 수준에서 일어나는 일에 대해 걱정할 필요가 없습니다.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView reloadData]; // to reload selected cell
}

위의 코드를 컨트롤러에 추가하기 만하면 두 번째보기에서 돌아올 때 올바른 일이 발생하는 것을 볼 수 있습니다. 에 대한 호출 reloadData은 테이블 뷰에 모델에서 셀을 새로 고쳐야하며 다른 모든 것은 잘 따라갑니다.


선택한 셀만 다시로드하려면 다음과 같이 viewWillAppear:사용자 지정 하위 클래스에서 재정의 합니다 UITableViewController.

- (void)viewWillAppear:(BOOL)animated
{
    NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow];
    [super viewWillAppear:animated]; // clears selection
    if (selectedRowIndexPath) {
        [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone];
    }
}

참고 : (기본값)으로 clearsSelectionOnViewWillAppear설정 했다고 가정하면를 YES호출하기 전에 선택한 행의 인덱스 경로 super를 가져와야 선택 항목이 지워집니다.

또한 @ZoranSimic 을 호출 하는 솔루션은[self.tablView reloadData] 코드가 적고 여전히 효율적이기 때문에 허용됩니다.

마지막으로, 테이블 뷰의 셀을 그들이 나타내는 모델 객체와 동기화 상태로 유지하는 가장 좋은 방법은 NSFetchedResultsController키-값 관찰 (KVO)을 좋아 하고 사용하거나 NSNotification모델 객체가 변경 될 때 테이블 뷰 컨트롤러에이를 알리는 것입니다. 해당 셀을 다시로드 할 수 있습니다. 테이블 뷰 컨트롤러는 모델 객체의 변경 사항을 관찰하기 시작하고 관찰을 viewDidLoad끝낼 dealloc수 있습니다 (그리고 수동으로 언로드하는self.view 모든 곳 ).


Zoran Simic답변 외에도 Swift 코드 :

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}

UINavigationControllerDelegate뷰 컨트롤러를 팝핑 할 때 새로 고침을위한 로직을 생성 하고 메소드를 구현할 수 있습니다.

이를 수행하는 또 다른 방법은 테이블 뷰 컨트롤러에서 일부 로직을 구현 viewWillAppear하여 팝된 뷰 컨트롤러의 데이터를 기반으로 새로 고치는 것입니다.

두 번째 뷰 컨트롤러에서 첫 번째 뷰 컨트롤러로 데이터를 보내야하는 경우 두 번째 뷰 컨트롤러가 이전 뷰 컨트롤러의 존재를 "알지 못함"을 기억하세요. 투명해야합니다. 두 번째 뷰 컨트롤러가 첫 번째 뷰 컨트롤러로 데이터를 보내도록하는 프로토콜을 구현해야합니다. 첫 번째 뷰 컨트롤러가 델리게이트이고 두 번째 뷰 컨트롤러가 델리게이트에 정보를 보낼 것이기 때문에이 문제에 대한 세 번째 옵션이 될 것입니다. 따라서 테이블 뷰 (첫 번째 뷰 컨트롤러)를 다시로드 할 준비를 할 수 있습니다. 수신 된 데이터.


viewWillAppear뷰가 처음 나타날 때마다 호출됩니다. 뒤로 이동할 때만 뷰를 다시로드하는 솔루션은 다음과 같습니다.

나는 하나 개의 변수를 만들어 .h file내의 ViewController가 있음을 나는이에 가서 처음으로 확인하기 위해 ViewController또는 때 탐색 다시

@property (nonatomic) BOOL isViewExist;

그 후 viewWillAppear

-(void)viewWillAppear:(BOOL)animated{
    if(!self.isViewExist){
        self.isViewExist = YES; // check it is the first time you go to this ViewController -> don't reload anything
    }else{
        [self.tableView reloadData]; // to reload the tableview data
        // or your can refresh anything in your ViewController as you want
    }
}

이 도움을 바랍니다


지금 도움이 될 수 있습니다.

대한 스위프트 2+

viewDidAppear 메서드에서 :

모든 테이블을 다시로드하려면 다음을 수행하십시오.

tableView.reloadData()

선택한 셀만 다시로드하려는 경우.

let index = tableView.indexPathForSelectedRow
if (index != nil){
  self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic)
}

Swift 3 업데이트

let index = tableView.indexPathForSelectedRow
    if (index != nil){
        self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic)
    }

참조 URL : https://stackoverflow.com/questions/3747842/reload-uitableview-when-navigating-back

반응형