it-swarm.asia

UIRefreshControl دون UITableViewController

مجرد فضول ، حيث لا يبدو ذلك ممكنًا على الفور ، ولكن هل هناك طريقة سريعة للاستفادة من فئة iOS 6 UIRefreshControl الجديدة دون استخدام فئة فرعية UITableViewController؟

غالبًا ما أستخدم UIViewController مع عرض فرعي UITableView وأتوافق مع UITableViewDataSource و UITableViewDelegate بدلاً من استخدام UITableViewController صريحًا.

305
Keller

على حدس ، واستناداً إلى إلهام DrummerB ، حاولت ببساطة إضافة مثيل UIRefreshControl كمقابلة فرعية إلى 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;
386
Keller

للقضاء على تلعثم الناجم عن الإجابة المقبولة ، يمكنك تعيين 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 بدون تلعثم والاحتفاظ بالرسوم المتحركة Nice بعد تحديث البيانات في عرض الجدول.

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];
}
94
Piotr Tomasik

ما ستجربه هو استخدام طريقة عرض الحاوية داخل ViewController الذي تستخدمه. يمكنك تحديد فئة فرعية نظيفة UITableViewController مع عرض جدول مخصص ووضعه في ViewController.

21
Tomohisa Takaoka

حسنا UIRefreshControl هي فئة فرعية من UIView ، لذلك يمكنك استخدامها بمفردها. لست متأكدا من كيف يجعل نفسه. يمكن أن يعتمد العرض ببساطة على الإطار ، ولكن يمكن أن يعتمد أيضًا على UIScrollView أو UITableViewController.

في كلتا الحالتين ، سيكون أكثر من مجرد اختراق حل أنيق. أنصحك بالنظر إلى أحد الحيوانات المستنسخة لجهة خارجية أو كتابة مستنداتك الخاصة.

ODRefreshControl

enter image description here

SlimeRefresh

enter image description here

18
DrummerB

حاول تأخير استدعاء الأسلوب refreshControl -endRefresh بكسر من ثانية بعد إعادة تحميل الجدول لعرض محتوياته ، إما باستخدام NSObject's -performSelector:withObject:afterDelay: أو GCD's 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];
7
boliva

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
    }

}

 enter image description here 

(إذا كنت تريد التعرف على iOS 10 UIRefreshControl ، فاقرأ هنا .

6
Ashok R

تؤدي إضافة عنصر تحكم التحديث كطريقة عرض فرعية إلى إنشاء مساحة فارغة أعلى رؤوس الأقسام.

بدلاً من ذلك ، قمت بتضمين UITableViewController في UIViewController ، ثم غيرت خاصية tableView الخاصة بي للإشارة إلى المضمنة ، وفيولا! تغييرات رمز الحد الأدنى. :-)

خطوات:

  1. قم بإنشاء UITableViewController جديد في Storyboard وقم بدمجه في UIViewController الأصلي
  2. استبدل @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
    }

    ...
}
3
cbh2000

للحصول على سويفت 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()
}
2
stakahop

جرب هذا،

الحلول المذكورة أعلاه جيدة ولكن tableView.refreshControl متاح لـ UITableViewController فقط ، حتى الإصدار 9.x من نظام التشغيل iOS ويأتي في UITableView من الإصدار 10.x من نظام التشغيل iOS وما بعده.

مكتوب في سويفت 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)
0
Ankit Kumar Gupta

إليك حل آخر مختلف قليلاً.

اضطررت لاستخدامه بسبب بعض مشكلات التسلسل الهرمي للعرض التي كنت أواجهها: كنت أقوم بإنشاء بعض الوظائف التي تتطلب تمرير طرق العرض إلى أماكن مختلفة في التسلسل الهرمي للعرض ، والتي تم قطعها عند استخدام طريقة عرض جدول UITableViewController ب/ج. self.view) وليس مجرد عرض منتظم ، فقد أنشأ تسلسلًا هرميًا غير متناسق للتحكم/العرض وتسبب في حدوث عطل.

قم بإنشاء فئة فرعية خاصة بك من UITableViewController وتجاوز loadView لتعيين self.view طريقة عرض مختلفة ، وتجاوز خاصية 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 ، فإن هذا سيكون أكثر قوة ، بمعنى أن عرض الجدول أصبح الآن عرضًا عاديًا ، وليس عرض جذر 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.view عن self.tableView ، فمن الممكن الآن استخدام UITableViewController كأكثر من وحدة تحكم منتظمة ، وإضافة المقابلات الفرعية الأخرى إلى self.view دون الغريب في إضافة المقابلات الفرعية إلى UITableView ، لذلك قد يفكر المرء في إجراء عرض وحدات التحكم مباشرة فئة فرعية من UITableViewController بدلاً من وجود أطفال UITableViewController.

بعض الأشياء التي يجب الانتباه إليها:

نظرًا لأننا نتجاوز خاصية عرض الجدول دون الاتصال بـ super ، فقد يكون هناك بعض الأشياء التي يجب الانتباه إليها ويجب معالجتها عند الضرورة. على سبيل المثال ، لن يؤدي تعيين عرض الجدول في المثال أعلاه إلى إضافة عرض الجدول إلى self.view ولن يقوم بتعيين الإطار الذي قد ترغب في القيام به. أيضًا ، في هذا التطبيق ، لا يوجد جدول افتراضي يتم تقديمه لك عندما يتم إنشاء مثيل للفصل ، وهو أيضًا شيء قد تفكر في إضافته. أنا لا أدرجها هنا لأن هذا كل حالة على حدة ، وهذا الحل يناسب في الواقع حل كيلر.

0
psilencer