UITableViewController없이 UITableView를 새로 고치려면 당기십시오.


180

UIViewController 내의 UITableView에서 pull to refresh 기능을 구현하려고합니다. UITableView가 뷰 컨트롤러에서 더 작은 하위보기가되기를 원하기 때문에 UITableViewController를 사용할 수 없습니다. 나는 이것이 가능하다고 생각하지만 그것을 구현 한 사람이 있습니까?

답변:


465

: UITableView를 사용하지 않고 새로 고침 컨트롤을에 직접 추가UITableViewController

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)

    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}

@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

1
훌륭하고 쉽습니다. iOS 7.0.4의 UIViewController에 추가 된 테이블보기에서 시도했을 때 저에게 효과적입니다.
thandasoru

5
컨트롤 자체가 보이지 않지만 잘 작동하는 것처럼 보이는 사람이 있습니까?
remotevision

16
"클릭"하면 테이블 뷰가 예기치 않게 줄어드는 것처럼 보입니다. 왜 아직 확실하지 않습니다.
Bob Spryn

3
나는 그것이 iOS 7 기능인지 확실하지 않은 viewdidappear로 가야한다는 것을 알았습니다.-아직 iOS 8에서 테스트하지는 않습니다 ...
Jack Solomon

4
refreshControl이 tableView 위에 나타납니다. 나는 이것을 수정했다 : tableView.insertSubview(refreshControl, atIndex: 0)대신tableView.addSubview(refreshControl)
kbpontius

12

목표 -C :

이것이 테이블 뷰에 대해 새로 고침 풀을 구현하는 방법입니다. 컬렉션보기의 경우와 동일합니다. 테이블 뷰 alloc을 콜렉션 뷰로 바꾸십시오.

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];

UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];

#pragma mark - Handle Refresh Method

-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}

신속한 버전이 430 이상일 때 obj-c 버전에는 9 개의 공감이 어떻게 있습니까?
체이스 로버츠

1
@ChaseRoberts, 2 월 13 일에 답변을 받았으며, 편집 기록을 살펴 보았습니다. 원래는 objective-c였습니다. 당시에는 스위프트가 새롭기 때문에 모든 사람들이 스위프트 버전을 찾고있었습니다 ... stackoverflow.com/posts / 15010646 / 개정
Irfan

4

@berik 의이 솔루션은 정상적으로 작동하지만 UIController는 UITableViewController 위에 표시됩니다. 이를 수정하는 방법은 다음 변경을 수행하는 것입니다.

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

3
refreshControl이 나를 위해 tableView의 상단에 나타나지만 귀하의 제안으로 인해 refreshControl아래가 나타나지 않습니다 tableView. 이 문제를 다음과 같이 수정했습니다. tableView.addSubview (refreshControl) 대신 tableView.insertSubview (refreshControl, atIndex : 0)
kbpontius

3

UIViewController와 간단한 테이블 뷰를 사용하여 EGORefreshTableHeaderView를 구현했습니다. 테이블 뷰 자체가 스크롤 뷰에서 상속되면 EGO가 스크롤 뷰를 매개 변수로 사용하는 곳의 트릭입니다.

그것은 단지 몇 가지 추가 연결이 필요합니다 :)

도움이 되었기를 바랍니다.


-1

viewController의 loadView 메소드 내에 UIRefreshControl을 작성하면 모든 것이 잘 작동하는 것 같습니다. UIRefreshControl은 정상적으로 동작합니다. iOS 7.1 및 iOS 8.2에서 테스트


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.