すぐに可能とは思えないので興味深いのですが、サブクラスUIRefreshControl
を使用せずに新しい iOS 6 クラスを活用するための巧妙な方法はありますか?UITableViewController
私はよくサブビューでUIViewController
aを使用し、完全に使用するのではなくandに準拠します。UITableView
UITableViewDataSource
UITableViewDelegate
UITableViewController
すぐに可能とは思えないので興味深いのですが、サブクラスUIRefreshControl
を使用せずに新しい iOS 6 クラスを活用するための巧妙な方法はありますか?UITableViewController
私はよくサブビューでUIViewController
aを使用し、完全に使用するのではなくandに準拠します。UITableView
UITableViewDataSource
UITableViewDelegate
UITableViewController
直感で、DrummerB のインスピレーションに基づいて、単純にUIRefreshControl
インスタンスをサブビューとして my に追加してみました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
ます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 に依存する場合もあります。
いずれにせよ、それは洗練されたソリューションというよりもハックになるでしょう。利用可能なサードパーティのクローンのいずれかを調べるか、独自のクローンを作成することをお勧めします。
NSObjectまたは GCD の-endRefresh
いずれかを使用して、tableView がコンテンツをリロードした後、refreshControl メソッドの呼び出しを数分の 1 遅らせてみてください。-performSelector:withObject:afterDelay:
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
私はそれをテストしましたが、これはコレクション ビューでも機能します。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
プロパティを変更して、埋め込まれたものを指すようにしました。最小限のコード変更。:-)
手順:
@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
}
...
}
Swift 2.2 の場合。
最初に UIRefreshControl() を作成します。
var refreshControl : UIRefreshControl!
viewDidLoad() メソッドに以下を追加します。
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()
}