[objective-c] UITableViewController가없는 UIRefreshControl

즉시 궁금하지는 않지만 호기심이 많지만 하위 UIRefreshControl클래스를 사용하지 않고 새로운 iOS 6 클래스 를 활용하는 은밀한 방법이 UITableViewController있습니까?

나는 종종를 사용 UIViewControllerUITableView서브 뷰와 준수 UITableViewDataSource하고 UITableViewDelegate오히려를 사용하는 것보다 UITableViewController철처.



답변

직감하고 DrummerB의 영감에 따라 UIRefreshControl인스턴스를 하위 뷰로 간단히 추가하려고했습니다 UITableView. 그리고 그것은 마술처럼 작동합니다!

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

이것은 UIRefreshControl테이블 뷰 위에 위를 추가 하고 UITableViewController🙂 을 사용할 필요없이 예상대로 작동합니다.


편집 : 위의 내용은 여전히 ​​작동하지만 몇 가지 지적했듯이 UIRefreshControl 을이 방법으로 추가 할 때 약간의 “말더듬”이 있습니다. 이에 대한 해결책은 UITableViewController를 인스턴스화 한 다음 UIRefreshControl 및 UITableView를 다음과 같이 설정하는 것입니다.

UITableViewController *tableViewController = [[UITableViewController alloc] init];
tableViewController.tableView = self.myTableView;

self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(getConnections) forControlEvents:UIControlEventValueChanged];
tableViewController.refreshControl = self.refreshControl;


답변

허용 대답에 의해 발생하는 더듬을 제거하기 위해, 당신은 당신을 할당 할 수 있습니다 UITableViewA를 UITableViewController.

_tableViewController = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
[self addChildViewController:_tableViewController];

_tableViewController.refreshControl = [UIRefreshControl new];
[_tableViewController.refreshControl addTarget:self action:@selector(loadStream) forControlEvents:UIControlEventValueChanged];

_theTableView = _tableViewController.tableView;

편집하다:

더듬 지 않고을 추가 UIRefreshControl하지 UITableViewController않고 테이블 뷰에서 데이터를 새로 고친 후 멋진 애니메이션을 유지하는 방법입니다.

UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.theTableView addSubview:refreshControl];
[self.theTableView sendSubviewToBack:refreshControl];

나중에 새로 고친 데이터를 처리 할 때 …

- (void)handleRefresh:(UIRefreshControl *)refreshControl {
    [self.theTableView reloadData];
    [self.theTableView layoutIfNeeded];
    [refreshControl endRefreshing];
}


답변

시도하는 것은 사용중인 ViewController 내부의 컨테이너보기를 사용하는 것입니다. 전용 테이블 뷰로 깨끗한 UITableViewController 서브 클래스를 정의하고 ViewController에 배치 할 수 있습니다.


답변

UIRefreshControl은 UIView 하위 클래스이므로 자체적으로 사용할 수 있습니다. 어떻게 렌더링되는지 잘 모르겠습니다. 렌더링은 단순히 프레임에 의존 할 수 있지만 UIScrollView 또는 UITableViewController에 의존 할 수도 있습니다.

어느 쪽이든, 그것은 우아한 솔루션보다 해킹이 될 것입니다. 사용 가능한 타사 복제본 중 하나를 보거나 직접 작성하는 것이 좋습니다.

ODRefreshControl

여기에 이미지 설명을 입력하십시오

슬라임

여기에 이미지 설명을 입력하십시오


답변

-endRefreshNSObject -performSelector:withObject:afterDelay:또는 GCD를 사용하여 tableView가 내용을 다시로드 한 후 새로 고침 컨트롤 메서드에 대한 호출을 1 초 정도 지연하십시오 dispatch_after.

이를 위해 UIRefreshControl에 카테고리를 작성했습니다.

@implementation UIRefreshControl (Delay)

- (void)endRefreshingAfterDelay:(NSTimeInterval)delay {
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self endRefreshing];
    });
}

@end

나는 그것을 테스트했고 이것은 Collection Views에서도 작동합니다. 0.01 초 정도의 지연이 충분하다는 것을 알았습니다.

// My data refresh process here while the refresh control 'isRefreshing'
[self.tableView reloadData];
[self.refreshControl endRefreshingAfterDelay:.01];


답변

iOS 10 스위프트 3.0

간단 해

import UIKit

class ViewControllerA: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var myTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        myTableView.delegate = self
        myTableView.dataSource = self

        if #available(iOS 10.0, *) {
            let refreshControl = UIRefreshControl()
            let title = NSLocalizedString("PullToRefresh", comment: "Pull to refresh")
            refreshControl.attributedTitle = NSAttributedString(string: title)
            refreshControl.addTarget(self,
                                     action: #selector(refreshOptions(sender:)),
                                     for: .valueChanged)
            myTableView.refreshControl = refreshControl
        }
    }

    @objc private func refreshOptions(sender: UIRefreshControl) {
        // Perform actions to refresh the content
        // ...
        // and then dismiss the control
        sender.endRefreshing()
    }

    // MARK: - Table view data source

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 12
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        cell.textLabel?.text = "Cell \(String(indexPath.row))"
        return cell
    }

}

여기에 이미지 설명을 입력하십시오

iOS 10 UIRefreshControl에 대해 배우려면 여기를 참조하십시오 .


답변

새로 고치기 제어를 서브 뷰로 추가하면 섹션 헤더 위에 빈 공간이 작성됩니다.

대신 UITableViewController를 UIViewController에 포함시킨 다음 tableView포함 된 속성과 비올라를 가리 키도록 속성을 변경했습니다 . 최소한의 코드 변경. 🙂

단계 :

  1. 스토리 보드에서 새 UITableViewController를 만들고 원래 UIViewController에 포함하십시오.
  2. @IBOutlet weak var tableView: UITableView!아래와 같이 새로 내장 된 UITableViewController의 것으로 교체하십시오.

class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tableViewController = self.childViewControllers.first as! UITableViewController
        tableView = tableViewController.tableView
        tableView.dataSource = self
        tableView.delegate = self

        // Now we can (properly) add the refresh control
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: "handleRefresh:", forControlEvents: .ValueChanged)
        tableViewController.refreshControl = refreshControl
    }

    ...
}