UITableViewController가 없는 UIRefreshControl
단지 궁금할 뿐, 당장은 가능해 보이지 않지만, 새로운 iOS 6를 활용할 수 있는 교활한 방법이 있습니까?UIRefreshControl
클래스는않지를 하지 않는 UITableViewController
서브클래스?
나는 자주 사용합니다.UIViewController
UITableView
에 부합합니다.UITableViewDataSource
그리고.UITableViewDelegate
를 사용하는 것보다UITableViewController
노골적으로
직감적으로, 그리고 드러머 B의 영감을 바탕으로, 저는 간단히 추가하려고 노력했습니다.UIRefreshControl
의 의서로인스턴의 .UITableView
그리고 그것은 마법처럼 작동합니다!
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.myTableView addSubview:refreshControl];
이는 다음을 추가합니다.UIRefreshControl
뷰는 테이블 뷰를 .UITableViewController
:)
편집: 위의 내용은 여전히 유효하지만 일부에서 지적했듯이 UIRfreshControl을 이러한 방식으로 추가할 때 약간의 "터덜터덜"이 발생합니다.이에 대한 솔루션은 UITableViewController를 인스턴스화한 다음 UIRfreshControl 및 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
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에 따라 달라질 수도 있습니다.
어느 쪽이든 우아한 해결책이라기보다는 해킹에 가까울 것입니다.사용 가능한 타사 복제본 중 하나를 조사하거나 직접 작성하는 것이 좋습니다.
refreshControl 을 지연해 .-endRefresh
NSObject를 로드합니다.-performSelector:withObject:afterDelay:
"GCD".dispatch_after
.
이를 위해 UIRfreshControl에 범주를 만들었습니다.
@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
테스트를 해봤는데 컬렉션 보기에서도 작동합니다.0.01초 정도의 짧은 지연이면 충분하다는 것을 알게 되었습니다.
// My data refresh process here while the refresh control 'isRefreshing'
[self.tableView reloadData];
[self.refreshControl endRefreshingAfterDelay:.01];
IOS 10 Swift 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 UIRfreshControl에 대해 알고 싶다면 여기를 읽으십시오.
새로 고침 컨트롤을 하위 뷰로 추가하면 섹션 헤더 위에 빈 공간이 생성됩니다.
"UIViewController"를 했습니다.tableView
내장된 것을 가리키는 속성, 그리고 비올라!코드 변경이 최소화되었습니다. :-)
단계:
- Storyboard에서 새 UITableViewController를 생성하여 원래 UIViewController에 포함합니다.
- 를 바꿉니다.
@IBOutlet weak var tableView: UITableView!
된 것처럼 된 UITableViewController에서하는 것으로, 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
}
...
}
Swift 2.2의 경우.
먼저 UIRefreshControl()을 만듭니다.
var refreshControl : UIRefreshControl!
보기 DidLoad() 메서드에서 다음을 추가합니다.
refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Refreshing..")
refreshControl.addTarget(self, action: #selector(YourUIViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(refreshControl)
그리고 새로 고침 기능을 만듭니다.
func refresh(refreshControl: UIRefreshControl) {
// do something ...
// reload tableView
self.tableView.reloadData()
// End refreshing
refreshControl.endRefreshing()
}
조금 다른 해결책이 있습니다.
몇 가지 보기 계층 문제로 인해 이 기능을 사용해야 했습니다. 보기 계층에서 보기를 다른 위치로 전달해야 하는 일부 기능을 만들고 있었습니다. 이 기능은 UITableViewController의 테이블 뷰 b/c를 사용할 때 중단되었습니다. 테이블뷰는 단순히 일반 보기가 아니라 UITableViewController의 루트 뷰(self.view)입니다.컨트롤러/뷰 계층 구조가 일관되지 않아 충돌이 발생했습니다.
기본적으로 자신만의 UITableViewController 하위 클래스를 만들고 loadView를 재정의하여 자체를 할당합니다.다른 뷰를 보고 tableView 속성을 재정의하여 별도의 테이블 뷰를 반환합니다.
예:
@interface MyTableVC : UITableViewController
@end
@interface MyTableVC ()
@property (nonatomic, strong) UITableView *separateTableView;
@end
@implementation MyTableVC
- (void)loadView {
self.view = [[UIView alloc] initWithFrame:CGRectZero];
}
- (UITableView *)tableView {
return self.separateTableView;
}
- (void)setTableView:(UITableView *)tableView {
self.separateTableView = tableView;
}
@end
Keller의 솔루션과 결합하면 tableView가 VC의 루트 뷰가 아닌 일반 뷰라는 점에서 더욱 견고해지고 뷰 계층의 변화에 대해 더욱 견고해집니다.이러한 방식으로 사용하는 예:
MyTableVC *tableViewController = [[MyTableVC alloc] init];
tableViewController.tableView = self.myTableView;
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(getConnections) forControlEvents:UIControlEventValueChanged];
tableViewController.refreshControl = self.refreshControl;
다음과 같은 다른 용도가 있습니다.
이런 식으로 하위 분류를 하면 자기 자신이 분리됩니다.self.tableView에서 보기, 이제 이 UITableViewController를 일반 컨트롤러로 사용하고 다른 하위 뷰를 self에 추가할 수 있습니다.하위 뷰를 UITableView에 추가하는 이상한 점 없이 보기를 사용할 수 있으므로, UITableViewController 하위 클래스 대신 뷰 컨트롤러를 직접 UITableViewController의 하위 클래스로 만드는 것을 고려할 수 있습니다.
주의해야 할 사항:
super를 호출하지 않고 tableView 속성을 재정의하기 때문에 주의해야 할 사항이 있을 수 있으며 필요한 경우 처리해야 합니다.예를 들어 위의 예에서 테이블 보기를 설정해도 테이블 보기가 자체에 추가되지 않습니다.원하는 프레임을 보고 설정하지 않습니다.또한 이 구현에서는 클래스가 인스턴스화될 때 제공되는 기본 tableView가 없으며 이는 추가할 수도 있습니다.여기에 포함하지 않는 이유는 케이스 바이 케이스이기 때문입니다. 그리고 이 솔루션은 실제로 켈러의 솔루션과 잘 맞습니다.
이거 해봐요.
위의 솔루션은 괜찮지만 tableView.refreshControl은 iOS 9.x부터 UITableView로 제공될 때까지 UITableView 컨트롤러에서만 사용할 수 있습니다.
스위프트 3로 작성 -
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(FeedViewController.loadNewData), for: UIControlEvents.valueChanged)
// Fix for the RefreshControl Not appearing in background
tableView?.addSubview(refreshControl)
tableView.sendSubview(toBack: refreshControl)
Keller의 첫 번째 제안은 iOS 7에서 뷰 컨트롤러가 다시 나타난 후 테이블의 삽입이 증가하는 이상한 버그를 유발합니다.두 번째 답변으로 변경하고, 적합한 뷰 컨트롤러를 사용하여 저를 위해 수정했습니다.
UItableView 하위 뷰에서 UIViewController를 사용하고 UItableViewDataSource 및 UItableViewDelicate를 준수할 때 다음을 사용할 수 있는 것으로 나타났습니다.
self.refreshControl = [[UIRefreshControl alloc]init];
[self.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
언급URL : https://stackoverflow.com/questions/12497940/uirefreshcontrol-without-uitableviewcontroller
'programing' 카테고리의 다른 글
Android에서 ListView 사이의 줄을 제거하려면 어떻게 해야 합니까? (0) | 2023.06.05 |
---|---|
패키지에서 setup.py (setuptools)에 정의된 버전을 가져오려면 어떻게 해야 합니까? (0) | 2023.06.05 |
색상 1과 색상 2의 범위에서 n가지 색상의 그라데이션 (0) | 2023.06.05 |
Android 8: 일반 텍스트 HTTP 트래픽이 허용되지 않음 (0) | 2023.06.05 |
스레드화 모듈과 멀티프로세싱 모듈의 차이점은 무엇입니까? (0) | 2023.06.05 |