Swift에서 pull을 사용하여 새로 고치는 방법
swift를 사용하여 RSS 리더를 구축하고 있으며 새로고침 기능을 구현해야 합니다.
이것이 내가 그것을 하려고 하는 방법이다.
class FirstViewController: UIViewController,
UITableViewDelegate, UITableViewDataSource {
@IBOutlet var refresh: UIScreenEdgePanGestureRecognizer
@IBOutlet var newsCollect: UITableView
var activityIndicator:UIActivityIndicatorView? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.newsCollect.scrollEnabled = true
// Do any additional setup after loading the view, typically from a nib.
if nCollect.news.count <= 2{
self.collectNews()
}
else{
self.removeActivityIndicator()
}
view.addGestureRecognizer(refresh)
}
@IBAction func reload(sender: UIScreenEdgePanGestureRecognizer) {
nCollect.news = News[]()
return newsCollect.reloadData()
}
다음 정보를 얻을 수 있습니다.
super.init 호출 시 속성 'self.refresh'가 초기화되지 않았습니다.
제스처 인식자의 행동을 이해할 수 있도록 도와주세요.샘플 코드를 사용하면 도움이 됩니다.
감사해요.
iOS에는 풀 투 리프레쉬 기능이 내장되어 있습니다.이렇게 빨리 할 수 있어요.
let refreshControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: #selector(self.refresh(_:)), for: .valueChanged)
tableView.addSubview(refreshControl) // not required when using UITableViewController
}
@objc func refresh(_ sender: AnyObject) {
// Code to refresh table view
}
어느 시점에서 리프레쉬를 종료할 수 있습니다.
refreshControl.endRefreshing()
스토리보드와 Swift를 갖춘 솔루션:
.storyboard 파일을 열고 스토리보드에서 TableViewController를 선택하고 유틸리티에서 TableViewController: Refresh 기능을 "활성화"합니다.
있는 것을 .
UITableViewController
5 을 Swift 5에 합니다.viewDidLoad
★★★★★★ 。self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)
viewDidLoad 메서드 위에 다음 메서드를 추가합니다.
func refresh(sender:AnyObject) { // Updating your data here... self.tableView.reloadData() self.refreshControl?.endRefreshing() }
UIRefresh Control은 각각에서 직접 지원됩니다.UICollectionView
,UITableView
★★★★★★★★★★★★★★★★★」UIScrollView
필요) (iOS 10+ 필요)
각 뷰에는 refreshControl 인스턴스 속성이 있습니다.즉, 스크롤뷰에 서브뷰로 추가할 필요가 없어지기 때문에 다음 작업만 하면 됩니다.
@IBOutlet weak var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(doSomething), for: .valueChanged)
// this is the replacement of implementing: "collectionView.addSubview(refreshControl)"
collectionView.refreshControl = refreshControl
}
@objc func doSomething(refreshControl: UIRefreshControl) {
print("Hello World!")
// somewhere in your code you might need to call:
refreshControl.endRefreshing()
}
개인적으로 서브뷰로 추가하는 것보다 스크롤뷰의 속성으로 취급하는 것이 더 자연스럽다고 생각합니다.특히 UIRefreshControl의 슈퍼뷰로서 적절한 뷰는 스크롤뷰뿐이기 때문에 UIRefreshControl을 사용하는 기능은 스크롤뷰로 작업할 때만 도움이 됩니다.그렇기 때문에 새로 고침 제어 뷰를 설정하기 위해서는 이 접근 방식이 더 명확해야 합니다.
아직 은 있습니다.addSubview
: iOS 버전:
if #available(iOS 10.0, *) {
collectionView.refreshControl = refreshControl
} else {
collectionView.addSubview(refreshControl)
}
스위프트 4
var refreshControl: UIRefreshControl!
override func viewDidLoad() {
super.viewDidLoad()
refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: #selector(refresh), for: .valueChanged)
tableView.addSubview(refreshControl)
}
@objc func refresh(_ sender: Any) {
// your code to reload tableView
}
또한 다음과 같은 기능을 통해 새로 고침을 중지할 수 있습니다.
refreshControl.endRefreshing()
스위프트 5
private var pullControl = UIRefreshControl()
pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
pullControl.addTarget(self, action: #selector(refreshListData(_:)), for: .valueChanged)
if #available(iOS 10.0, *) {
tableView.refreshControl = pullControl
} else {
tableView.addSubview(pullControl)
}
// Actions
@objc private func refreshListData(_ sender: Any) {
self.pullControl.endRefreshing() // You can stop after API Call
// Call API
}
Swift 사용 시
WebView를 갱신하려면 , 다음의 순서에 따릅니다.
이 코드를 사용해 보세요.
override func viewDidLoad() {
super.viewDidLoad()
addPullToRefreshToWebView()
}
func addPullToRefreshToWebView(){
var refreshController:UIRefreshControl = UIRefreshControl()
refreshController.bounds = CGRectMake(0, 50, refreshController.bounds.size.width, refreshController.bounds.size.height) // Change position of refresh view
refreshController.addTarget(self, action: Selector("refreshWebView:"), forControlEvents: UIControlEvents.ValueChanged)
refreshController.attributedTitle = NSAttributedString(string: "Pull down to refresh...")
YourWebView.scrollView.addSubview(refreshController)
}
func refreshWebView(refresh:UIRefreshControl){
YourWebView.reload()
refresh.endRefreshing()
}
Anhil의 대답이 나에게 많은 도움을 주었다.
다만, 한층 더 실험해 본 결과, 제시된 솔루션이 그다지 예쁘지 않은 UI의 결함을 일으키는 경우가 있는 것을 알 수 있었습니다.
대신, 이 접근방식을 택하는 것이 도움이 되었습니다*.
* 스위프트 2.1
//Create an instance of a UITableViewController. This will host your UITableView.
private let tableViewController = UITableViewController()
//Add tableViewController as a childViewController and set its tableView property to your UITableView.
self.addChildViewController(self.tableViewController)
self.tableViewController.tableView = self.tableView
self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
self.tableViewController.refreshControl = self.refreshControl
세부 사항
- Xcode 버전 10.3 (10G8) Swift 5
특징들
- 프로그래밍 방식으로 "Pull to Refresh"를 실행할 수 있는 기능
- 다중 "풀 투 리프레시" 이벤트로부터 보호
- 뷰 컨트롤러 전환 시 액티비티 인디케이터 애니메이션을 계속할 수 있는 기능(예: TabController의 경우)
솔루션
import UIKit
class RefreshControl: UIRefreshControl {
private weak var actionTarget: AnyObject?
private var actionSelector: Selector?
override init() { super.init() }
convenience init(actionTarget: AnyObject?, actionSelector: Selector) {
self.init()
self.actionTarget = actionTarget
self.actionSelector = actionSelector
addTarget()
}
private func addTarget() {
guard let actionTarget = actionTarget, let actionSelector = actionSelector else { return }
addTarget(actionTarget, action: actionSelector, for: .valueChanged)
}
required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
func endRefreshing(deadline: DispatchTime? = nil) {
guard let deadline = deadline else { endRefreshing(); return }
DispatchQueue.global(qos: .default).asyncAfter(deadline: deadline) { [weak self] in
DispatchQueue.main.async { self?.endRefreshing() }
}
}
func refreshActivityIndicatorView() {
guard let selector = actionSelector else { return }
let _isRefreshing = isRefreshing
removeTarget(actionTarget, action: selector, for: .valueChanged)
endRefreshing()
if _isRefreshing { beginRefreshing() }
addTarget()
}
func generateRefreshEvent() {
beginRefreshing()
sendActions(for: .valueChanged)
}
}
public extension UIScrollView {
private var _refreshControl: RefreshControl? { return refreshControl as? RefreshControl }
func addRefreshControll(actionTarget: AnyObject?, action: Selector, replaceIfExist: Bool = false) {
if !replaceIfExist && refreshControl != nil { return }
refreshControl = RefreshControl(actionTarget: actionTarget, actionSelector: action)
}
func scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: Bool = false) {
_refreshControl?.refreshActivityIndicatorView()
guard let refreshControl = refreshControl,
contentOffset.y != -refreshControl.frame.height else { return }
setContentOffset(CGPoint(x: 0, y: -refreshControl.frame.height), animated: changeContentOffsetWithAnimation)
}
private var canStartRefreshing: Bool {
guard let refreshControl = refreshControl, !refreshControl.isRefreshing else { return false }
return true
}
func startRefreshing() {
guard canStartRefreshing else { return }
_refreshControl?.generateRefreshEvent()
}
func pullAndRefresh() {
guard canStartRefreshing else { return }
scrollToTopAndShowRunningRefreshControl(changeContentOffsetWithAnimation: true)
_refreshControl?.generateRefreshEvent()
}
func endRefreshing(deadline: DispatchTime? = nil) { _refreshControl?.endRefreshing(deadline: deadline) }
}
사용.
// Add refresh control to UICollectionView / UITableView / UIScrollView
private func setupTableView() {
let tableView = UITableView()
// ...
tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
}
@objc func refreshData(_ refreshControl: UIRefreshControl) {
tableView?.endRefreshing(deadline: .now() + .seconds(3))
}
// Stop refreshing in UICollectionView / UITableView / UIScrollView
tableView.endRefreshing()
// Simulate pull to refresh in UICollectionView / UITableView / UIScrollView
tableView.pullAndRefresh()
풀샘플
여기에 솔루션 코드를 추가하는 것을 잊지 마십시오.
import UIKit
class ViewController: UIViewController {
private weak var tableView: UITableView?
override func viewDidLoad() {
super.viewDidLoad()
setupTableView()
}
private func setupTableView() {
let tableView = UITableView()
view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
tableView.dataSource = self
tableView.delegate = self
tableView.addRefreshControll(actionTarget: self, action: #selector(refreshData))
self.tableView = tableView
}
}
extension ViewController {
@objc func refreshData(_ refreshControl: UIRefreshControl) {
print("refreshing")
tableView?.endRefreshing(deadline: .now() + .seconds(3))
}
}
extension ViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int { return 1 }
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 20 }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "\(indexPath)"
return cell
}
}
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.pullAndRefresh()
}
}
「이러한 것은」입니다.refresh
초기화되지 않았습니다. 해서 '하다'를 선택한 것에 해 주세요.refresh
선택사항이 아닙니다.Swift에서는 콜을 하기 전에 값을 지정해야 합니다.super.init
(혹은 암묵적으로 불리고 있습니다만, 당신의 경우인 것 같습니다). 중 하나를 만듭니다.refresh
옵션(원하는 것을 선택) 또는 어떤 방법으로든 초기화합니다.
Swift 소개 문서를 다시 읽어보실 것을 권장합니다.이 문서는 매우 상세하게 다루고 있습니다.
에는 @Anil이라고 하는 제어를 이 내장되어 .UIRefresControl
조사해 볼 만한 가치가 있을지도 몰라요
저는 RSS 피드 앱을 만들었습니다.풀 투 리프레시 기능을 탑재하고 있습니다.이 기능에는, 상기의 몇개의 문제가 있었습니다.
다만, 유저에 대한 답변을 덧붙이자면, 사용 사례를 찾아 헤맸지만 찾을 수 없었습니다.웹(RSSFeed)에서 데이터를 다운로드하고 있었는데 테이블에서 새로고침할 스토리의 보기를 풀다운하려고 했습니다.
위에서 언급한 내용은 적절한 영역을 다루지만, 사람들이 겪고 있는 몇 가지 문제를 안고 있습니다.제가 한 일은 다음과 같습니다.그것은 큰 도움이 됩니다.
@Blankarsch의 어프로치를 취해 main.storyboard로 이동하여 리프레시를 사용할 테이블 뷰를 선택했지만 IBOutlet과 IBAction을 생성하여 리프레시를 효율적으로 사용하는 것은 언급하지 않았습니다.
//Created from main.storyboard cntrl+drag refresh from left scene to assistant editor
@IBOutlet weak var refreshButton: UIRefreshControl
override func viewDidLoad() {
......
......
//Include your code
......
......
//Is the function called below, make sure to put this in your viewDidLoad
//method or not data will be visible when running the app
getFeedData()
}
//Function the gets my data/parse my data from the web (if you havnt already put this in a similar function)
//remembering it returns nothing, hence return type is "-> Void"
func getFeedData() -> Void{
.....
.....
}
//From main.storyboard cntrl+drag to assistant editor and this time create an action instead of outlet and
//make sure arguments are set to none and note sender
@IBAction func refresh() {
//getting our data by calling the function which gets our data/parse our data
getFeedData()
//note: refreshControl doesnt need to be declared it is already initailized. Got to love xcode
refreshControl?.endRefreshing()
}
이게 나와 같은 상황에 있는 사람에게 도움이 되길 바란다.
func pullToRefresh(){
let refresh = UIRefreshControl()
refresh.addTarget(self, action: #selector(handleTopRefresh(_:)), for: .valueChanged )
refresh.tintColor = UIColor.appBlack
self.tblAddressBook.addSubview(refresh)
}
@objc func handleTopRefresh(_ sender:UIRefreshControl){
self.callAddressBookListApi(isLoaderRequired: false)
sender.endRefreshing()
}
모든 클래스에서 사용할 수 있도록 새로 고침을 위해 풀 확장 기능을 만들 것을 권장합니다.
1) 빈 swift file : File - New - File - Swift File로 만듭니다.
2) 다음 추가
// AppExtensions.swift
import Foundation
import UIKit
var tableRefreshControl:UIRefreshControl = UIRefreshControl()
//MARK:- VIEWCONTROLLER EXTENSION METHODS
public extension UIViewController
{
func makePullToRefreshToTableView(tableName: UITableView,triggerToMethodName: String){
tableRefreshControl.attributedTitle = NSAttributedString(string: "TEST: Pull to refresh")
tableRefreshControl.backgroundColor = UIColor.whiteColor()
tableRefreshControl.addTarget(self, action: Selector(triggerToMethodName), forControlEvents: UIControlEvents.ValueChanged)
tableName.addSubview(tableRefreshControl)
}
func makePullToRefreshEndRefreshing (tableName: String)
{
tableRefreshControl.endRefreshing()
//additional codes
}
}
3) View Controller에서 다음 메서드를 호출합니다.
override func viewWillAppear(animated: Bool) {
self.makePullToRefreshToTableView(bidderListTable, triggerToMethodName: "pullToRefreshBidderTable")
}
4) 갱신을 종료하고 싶은 시점:
func pullToRefreshBidderTable() {
self.makePullToRefreshEndRefreshing("bidderListTable")
//Code What to do here.
}
OR
self.makePullToRefreshEndRefreshing("bidderListTable")
리프레쉬를 위해 사용하고 있는 풀
DGElasticPullToRefresh(DGElasticPullToRef
https://github.com/gontovnik/DGElasticPullToRefresh
인스톨
포드 'DGElasticPullToRefresh'
import DGElasticPullToRefresh
그리고 이 함수를 당신의 빠른 파일에 넣고 당신의 function을 호출합니다.
func view를 덮어씁니다(_ 애니메이션:부울)
func Refresher() {
let loadingView = DGElasticPullToRefreshLoadingViewCircle()
loadingView.tintColor = UIColor(red: 255.0/255.0, green: 255.0/255.0, blue: 255.0/255.0, alpha: 1.0)
self.table.dg_addPullToRefreshWithActionHandler({ [weak self] () -> Void in
//Completion block you can perfrom your code here.
print("Stack Overflow")
self?.table.dg_stopLoading()
}, loadingView: loadingView)
self.table.dg_setPullToRefreshFillColor(UIColor(red: 255.0/255.0, green: 57.0/255.0, blue: 66.0/255.0, alpha: 1))
self.table.dg_setPullToRefreshBackgroundColor(self.table.backgroundColor!)
}
뷰가 삭제되는 동안 참조를 삭제하는 것을 잊지 마십시오.
이 코드를 리프레시하기 위해 pull을 제거하다
func viewDiDisplayed(_ 애니메이션:부울)
override func viewDidDisappear(_ animated: Bool) {
table.dg_removePullToRefresh()
}
그리고 그것은 마치
해피 코딩 :)
코드 몇 줄을 사용하면 이 작업을 수행할 수 있습니다.서드파티 라이브러리 또는 UI를 사용하는 이유.iOS에는 풀 투 리프레쉬 기능이 내장되어 있습니다.이렇게 빨리 할 수 있어요.
var pullControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
pullControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
pullControl.addTarget(self, action: #selector(pulledRefreshControl(_:)), for: UIControl.Event.valueChanged)
tableView.addSubview(pullControl) // not required when using UITableViewController
}
@objc func pulledRefreshControl(sender:AnyObject) {
// Code to refresh table view
}
tableView의 다음 서브클래스를 사용할 수 있습니다.
import UIKit
protocol PullToRefreshTableViewDelegate : class {
func tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
}
class PullToRefreshTableView: UITableView {
@IBOutlet weak var pullToRefreshDelegate: AnyObject?
private var refreshControl: UIRefreshControl!
private var isFirstLoad = true
override func willMoveToSuperview(newSuperview: UIView?) {
super.willMoveToSuperview(newSuperview)
if (isFirstLoad) {
addRefreshControl()
isFirstLoad = false
}
}
private func addRefreshControl() {
refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: "refresh", forControlEvents: .ValueChanged)
self.addSubview(refreshControl)
}
@objc private func refresh() {
(pullToRefreshDelegate as? PullToRefreshTableViewDelegate)?.tableViewDidStartRefreshing(self)
}
func endRefreshing() {
refreshControl.endRefreshing()
}
}
builder에서 테이블 를 1로 보기PullToRefreshTableView
'만들다'를 만들 수도 있습니다.PullToRefreshTableView
- 2 - - the를 합니다.PullToRefreshTableViewDelegate
3 -tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
되면 뷰 됩니다.
- 콜4 ★★yourTableView.endRefreshing()
하게
저는 Xcode 7.2를 사용하여 이렇게 작업을 하게 되었는데, 이것이 큰 버그라고 생각합니다. my my my i ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」UITableViewController
안에viewWillAppear
refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: "configureMessages", forControlEvents: .ValueChanged)
refreshControl!.beginRefreshing()
configureMessages()
func configureMessages() {
// configuring messages logic here
self.refreshControl!.endRefreshing()
}
는 문자 '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다', '아니다' configureMessage()
후 메서드UIRefreshControl
그 후, 그 후의 갱신은 정상적으로 동작합니다.
2023년, 이 단순함은
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
your data source = latest ...
table.reloadData()
table.refreshControl = UIRefreshControl()
table.refreshControl?.addTarget(self,
action: #selector(pulldown), for: .valueChanged)
table.refreshControl?.tintColor = .clear
}
@objc func pulldown() {
your data source = latest ...
table.reloadData()
DispatchQueue.main.async { self.table.refreshControl?.endRefreshing() }
}
대부분의 경우, 당신은 "스피너"를 원하지 않습니다.스피너를 숨기는 가장 쉬운 방법은 다음과 같습니다.
table.refreshControl?.tintColor = .clear
바로 그겁니다.
불명확한 으로 서브클래스를 하고 UIRefreshControl
그 방법을 알 수 있는 훌륭한 최신 답변이 여기에 있습니다.
다른 답변은 정답입니다.자세한 내용은 이 투고를 체크하여 새로 고칩니다.
스토리보드에서 새로 고침 사용
UITableViewController를 사용하는 경우 솔루션은 매우 간단합니다.먼저 스토리보드에서 테이블 뷰 컨트롤러를 선택하고 속성 검사기를 열고 새로 고침을 활성화합니다.
UITableViewController는 개봉 후 UIRefreshControl에 대한 참조가 포함되어 있습니다.사용자가 다운되었을 때 리프레시를 시작하고 완료하려면 몇 가지 사항을 배선하기만 하면 됩니다.
viewDidLoad()를 덮어씁니다.
viewDidLoad()를 덮어쓸 때 다음과 같이 새로 고침을 처리할 대상을 추가합니다.
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.refreshControl?.addTarget(self, action: "handleRefresh:", forControlEvents: UIControlEvents.ValueChanged)
}
- action 인수로 "handleRefresh:"(콜론에 주의)를 지정했으므로 이 UITableViewController 클래스에 같은 이름의 함수를 정의해야 합니다.또한 함수는 하나의 인수를 사용해야 합니다.
- Value Changed라는 UIControl Event에 대해 이 액션을 호출하고 싶습니다.
- 말고 꼭 해 주세요.
refreshControl.endRefreshing()
상세한 것에 대하여는, 「링크」를 참조해 주세요.모든 크레딧은 그 투고에 귀속됩니다.
커스터마이즈성, 코드 복제 및 새로고침 제어에 따른 버그 때문에, 다음을 사용하는 라이브러리 PullToRefreshDSL을 만들었습니다.DSL
와 같은 패턴SnapKit
// You only have to add the callback, rest is taken care of
tableView.ptr.headerCallback = { [weak self] in // weakify self to avoid strong reference
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) { // your network call
self?.tableView.ptr.isLoadingHeader = false // setting false will hide the view
}
}
magic 키워드만 추가하면 됩니다.ptr
UIScrollView 서브클래스(예: UITableView/UICollectionView) 후
라이브러리를 다운로드할 필요는 없습니다.소스 코드를 탐색하고 수정할 수 있습니다. iOS용으로 새로 고침하기 위한 풀 구현이 가능한 경우입니다.
언급URL : https://stackoverflow.com/questions/24475792/how-to-use-pull-to-refresh-in-swift
'source' 카테고리의 다른 글
다른 사용자로 PowerShell 실행 및 스크립트 실행 (0) | 2023.04.22 |
---|---|
Windows에서 Git에 CR+LF 대신 LF를 사용하도록 강제하는 방법은 무엇입니까? (0) | 2023.04.22 |
프로젝트 커밋 기록에서 삭제된 파일을 찾으려면 어떻게 해야 합니까? (0) | 2023.04.22 |
제공된 데이터가 Office 2007+ XML에 있는 것으로 보이는 Java POI (0) | 2023.04.22 |
excel의 regex를 찾아 대체하는 방법 (0) | 2023.04.22 |