Kel*_*ler 306 objective-c uitableview ios ios6 uirefreshcontrol
只是好奇,因为它似乎不可能,但有没有一个偷偷摸摸的方式来利用新的iOS 6 UIRefreshControl
类而不使用UITableViewController
子类?
我经常使用UIViewController
一个UITableView
子视图,并符合UITableViewDataSource
和UITableViewDelegate
而不是使用UITableViewController
顾左右而言他.
Kel*_*ler 386
在预感中,基于DrummerB的灵感,我尝试简单地将一个UIRefreshControl
实例作为子视图添加到我的UITableView
.它神奇地起作用!
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.myTableView addSubview:refreshControl];
Run Code Online (Sandbox Code Playgroud)
这会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;
Run Code Online (Sandbox Code Playgroud)
Pio*_*sik 94
要消除由接受的答案引起的口吃,您可以将您分配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;
Run Code Online (Sandbox Code Playgroud)
编辑:
添加一个没有断断续续的UIRefreshControl
no的方法UITableViewController
,并在刷新tableview上的数据后保留漂亮的动画.
UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[self.theTableView addSubview:refreshControl];
[self.theTableView sendSubviewToBack:refreshControl];
Run Code Online (Sandbox Code Playgroud)
稍后处理刷新数据时......
- (void)handleRefresh:(UIRefreshControl *)refreshControl {
[self.theTableView reloadData];
[self.theTableView layoutIfNeeded];
[refreshControl endRefreshing];
}
Run Code Online (Sandbox Code Playgroud)
Tom*_*oka 21
您将尝试使用您正在使用的ViewController中的容器视图.您可以使用专用的tableview定义干净的UITableViewController子类,并将其放在ViewController中.
Dru*_*erB 18
好的UIRefreshControl是一个UIView子类,所以你可以自己使用它.我不确定它是如何渲染自己的.渲染可以简单地依赖于框架,但它也可以依赖于UIScrollView或UITableViewController.
无论哪种方式,它都将是一个黑客而不是一个优雅的解决方案.我建议您查看一个可用的第三方克隆或编写自己的克隆.
-endRefresh
在tableView重新加载其内容后,尝试通过使用NSObject -performSelector:withObject:afterDelay:
或GCD 延迟对refreshControl 方法的调用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
Run Code Online (Sandbox Code Playgroud)
我测试了它,这也适用于集合视图.我注意到延迟小到0.01秒就足够了:
// My data refresh process here while the refresh control 'isRefreshing'
[self.tableView reloadData];
[self.refreshControl endRefreshingAfterDelay:.01];
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想了解iOS 10 UIRefreshControl,请阅读此处.
归档时间: |
|
查看次数: |
82243 次 |
最近记录: |