즉시 궁금하지는 않지만 호기심이 많지만 하위 UIRefreshControl
클래스를 사용하지 않고 새로운 iOS 6 클래스 를 활용하는 은밀한 방법이 UITableViewController
있습니까?
나는 종종를 사용 UIViewController
와 UITableView
서브 뷰와 준수 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;
답변
허용 대답에 의해 발생하는 더듬을 제거하기 위해, 당신은 당신을 할당 할 수 있습니다 UITableView
A를 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에 의존 할 수도 있습니다.
어느 쪽이든, 그것은 우아한 솔루션보다 해킹이 될 것입니다. 사용 가능한 타사 복제본 중 하나를 보거나 직접 작성하는 것이 좋습니다.
답변
-endRefresh
NSObject -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
포함 된 속성과 비올라를 가리 키도록 속성을 변경했습니다 . 최소한의 코드 변경. 🙂
단계 :
- 스토리 보드에서 새 UITableViewController를 만들고 원래 UIViewController에 포함하십시오.
@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
}
...
}