programing

UITableViewController가 없는 UIRefreshControl

linuxpc 2023. 6. 5. 23:41
반응형

UITableViewController가 없는 UIRefreshControl

단지 궁금할 뿐, 당장은 가능해 보이지 않지만, 새로운 iOS 6를 활용할 수 있는 교활한 방법이 있습니까?UIRefreshControl 클래스는않지를 하지 않는 UITableViewController서브클래스?

나는 자주 사용합니다.UIViewControllerUITableView에 부합합니다.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;

승인된 답변에 의해 발생하는 말더듬을 제거하기 위해, 당신은 다음을 할당할 수 있습니다.UITableViewUITableViewController.

_tableViewController = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
[self addChildViewController:_tableViewController];

_tableViewController.refreshControl = [UIRefreshControl new];
[_tableViewController.refreshControl addTarget:self action:@selector(loadStream) forControlEvents:UIControlEventValueChanged];

_theTableView = _tableViewController.tableView;

편집:

UIRefreshControlUITableViewController테이블 뷰의 데이터를 새로 고친 후에도 흔들림 없이 멋진 애니메이션을 유지할 수 있습니다.

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에 따라 달라질 수도 있습니다.

어느 쪽이든 우아한 해결책이라기보다는 해킹에 가까울 것입니다.사용 가능한 타사 복제본 중 하나를 조사하거나 직접 작성하는 것이 좋습니다.

ODRefresh 컨트롤

여기에 이미지 설명 입력

슬라임 새로 고침

여기에 이미지 설명 입력

refreshControl 을 지연해 .-endRefreshNSObject를 로드합니다.-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내장된 것을 가리키는 속성, 그리고 비올라!코드 변경이 최소화되었습니다. :-)

단계:

  1. Storyboard에서 새 UITableViewController를 생성하여 원래 UIViewController에 포함합니다.
  2. 를 바꿉니다.@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

반응형