[ios] Swift에서 pull을 사용하여 새로 고치는 방법은 무엇입니까?

스위프트를 사용하여 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에 내장 된 새로 고침 기능 이 내장되어 있습니다. 당신은 신속하게 이렇게 할 수 있습니다

var 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()


답변

스토리 보드와 신속한 솔루션 …

1.) .storyboard 파일을 열고 스토리 보드에서 TableViewController를 선택한 다음 유틸리티에서 Table View Controller-Refreshing 기능을 “활성화”하십시오.

여기에 이미지 설명을 입력하십시오

2.) 관련 UITableViewController-Class를 열고 viewDidLoad-Method에 다음 줄을 추가하십시오.

self.refreshControl?.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)

스위프트 5.0 편집 :

self.refreshControl?.addTarget(self, action: #selector(refresh), for: UIControl.Event.valueChanged)

스위프트 2.2 또는

self.refreshControl?.addTarget(self, action: #selector(TestTableViewController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged)

3.) viewDidLoad-Method 위에 다음 메소드를 추가하십시오.

func refresh(sender:AnyObject)
{
    // Updating your data here...

    self.tableView.reloadData()
    self.refreshControl?.endRefreshing()
}


답변

iOS 10부터 포함 된 PRETTY COOL 기능 에 대해 언급하고 싶습니다 .

지금은 UIRefreshControl는 직접 각 지원됩니다 UICollectionView, UITableViewUIScrollView!

이러한 각 뷰에는 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
}

func doSomething(refreshControl: UIRefreshControl) {
    print("Hello World!")

    // somewhere in your code you might need to call:
    refreshControl.endRefreshing()
}

개인적으로, 하위 뷰로 추가하는 것보다 스크롤 뷰의 속성으로 처리하는 것이 더 자연 스럽습니다. 특히 UIRefreshControl의 슈퍼 뷰로 적합한 뷰는 스크롤 뷰뿐입니다. 즉 UIRefreshControl을 사용하는 기능은 스크롤보기로 작업 할 때 유용합니다. 이것이 바로이 접근 방식이 새로 고침 제어보기를 설정하는 것이 더 분명한 이유입니다.

그러나 여전히 addSubviewiOS 버전 기반 의 옵션을 사용할 수 있습니다 .

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()


답변

에서 스위프트 이것을 사용,

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


답변

오류가 알려주 refresh는 것은 초기화되지 않았다는 것입니다. 당신이 만드는 것을 선택하는 것이 주 refresh는 것을 스위프트 수단에있는 선택하지 문의하기 전에 값을 가지고 super.init(또는 암시 적 사건으로 보인다,라고). 어느 만드는 refresh옵션 (당신이 원하는 아마 무엇을) 또는 그것을 어떤 방법으로 초기화합니다.

Swift 소개 문서를 다시 읽으십시오.

@Anil이 지적한 것처럼 대답의 일부가 아닌 마지막 한 가지는 iOS라는 컨트롤을 새로 고침하여 UIRefresControl볼만한 가치가있을 수 있습니다.