뒤로 이동할 때 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
'program story' 카테고리의 다른 글
.htaccess는 SSL / HTTPS를 사용하여 www를 www가 아닌 사이트로 리디렉션합니다. (0) | 2021.01.10 |
---|---|
자바 : Thread.interrupted ()와 Thread.isInterrupted ()의 사용법 차이? (0) | 2021.01.10 |
LINQ를 사용하여 C #의 정렬 목록 (0) | 2021.01.10 |
OpenWrap 대 NuGet (0) | 2021.01.10 |
malloc을 사용할 때`void * '에서`char *'로의 잘못된 변환? (0) | 2021.01.10 |