ดึงเพื่อรีเฟรช UITableView โดยไม่มี UITableViewController


180

ฉันพยายามใช้คุณลักษณะดึงเพื่อรีเฟรชใน UITableView ภายใน UIViewController ฉันไม่สามารถใช้ UITableViewController ได้เพราะฉันต้องการให้ UITableView เป็นมุมมองย่อยที่เล็กกว่าในตัวควบคุมมุมมองพร้อมกับสิ่งอื่น ๆ ที่อยู่ด้านบน ฉันคิดว่ามันเป็นไปได้ แต่มีใครเห็นการใช้งานของมันได้หรือไม่

คำตอบ:


465

เพิ่มการควบคุมการรีเฟรชลงใน a โดยตรงUITableViewโดยไม่ต้องใช้ a UITableViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: #selector(refresh(_:)), for: .valueChanged)

    if #available(iOS 10.0, *) {
        tableView.refreshControl = refreshControl
    } else {
        tableView.backgroundView = refreshControl
    }
}

@objc func refresh(_ refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

1
ยอดเยี่ยมและง่าย มันใช้งานได้สำหรับฉันเมื่อฉันลองดูในตารางที่เพิ่มไปยัง UIViewController บน iOS 7.0.4
thandasoru

5
มีใครมีปัญหาที่ไม่สามารถมองเห็นการควบคุมตัวเอง แต่ดูเหมือนว่าจะทำงานได้ดี?
remotevision

16
มุมมองตารางดูเหมือนจะกระโดดลงโดยไม่คาดหมายเมื่อมี "คลิก" ยังไม่แน่ใจว่าทำไม
Bob Spryn

3
ฉันพบว่ามันต้องไปใน viewdidappear ไม่แน่ใจว่าเป็นฟีเจอร์ iOS 7 - ฉันยังไม่ได้ทดสอบใน iOS 8 ...
แจ็คโซโลมอน

4
refreshControl จะปรากฏที่ด้านบนของ tableView ฉันแก้ไขสิ่งนี้โดย: tableView.insertSubview(refreshControl, atIndex: 0)แทนที่จะเป็นtableView.addSubview(refreshControl)
kbpontius

12

วัตถุประสงค์ -C :

นี่คือวิธีที่คุณสามารถใช้ pull เพื่อรีเฟรชสำหรับมุมมองตาราง เช่นเดียวกับในกรณีของมุมมองการรวบรวม เพียงแทนที่การจัดสรรมุมมองตารางด้วยมุมมองการรวบรวม

UITableView *tableViewDemo  =  [[UITableView alloc]init];
tableViewDemo.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
tableViewDemo.dataSource =  self;
tableViewDemo.delegate =  self;
[self.view addSubView: tableViewDemo];

UIRefreshControl *refreshController = [[UIRefreshControl alloc] init];
[refreshController addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
[tableViewDemo addSubview:refreshController];

#pragma mark - Handle Refresh Method

-(void)handleRefresh : (id)sender
{
   NSLog (@"Pull To Refresh Method Called");
   [refreshController endRefreshing];
}

รุ่น obj-c มี upvotes เพียง 9 ตัวเมื่อรุ่น swift มี> 430 เท่านั้น
Chase Roberts เมื่อ

1
@ChaseRoberts มีคำตอบในวันที่ 13 ก.พ. ดูที่ประวัติการแก้ไข แต่เดิมเป็นวัตถุประสงค์ -c เนื่องจากในเวลานั้น swift เป็นของใหม่ทุกคนกำลังมองหาเวอร์ชั่นที่รวดเร็ว ... stackoverflow.com/posts / 15010646 / การแก้ไข
Irfan

4

วิธีแก้ปัญหาจาก @berik ใช้งานได้ดี แต่ UIController แสดงที่ด้านบนของ UITableViewController วิธีแก้ไขคือทำการเปลี่ยนแปลงนี้:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

func refresh(refreshControl: UIRefreshControl) {
    // Do your job, when done:
    refreshControl.endRefreshing()
}

3
refreshControl ปรากฏด้านบนของ tableView สำหรับฉัน แต่ข้อเสนอแนะของคุณทำให้ฉันหายไปไม่ปรากฏดังต่อไปนี้refreshControl tableViewฉันแก้ไขสิ่งนี้โดย: tableView.insertSubview (refreshControl, atIndex: 0) แทน tableView.addSubview (refreshControl)
kbpontius

3

ฉันได้ติดตั้ง EGORefreshTableHeaderView ด้วย UIViewController และมุมมองตารางที่เรียบง่ายเคล็ดลับคือในสถานที่ที่ EGO ใช้มุมมองเลื่อนเป็นพารามิเตอร์ถ้าคุณดูมุมมองตารางตัวเองสืบทอดจากมุมมองเลื่อน

ต้องการเพียงแค่นั้นและการเชื่อมต่อเพิ่มเติมบางอย่าง :)

หวังว่านี่จะช่วยได้


-1

ดูเหมือนว่าถ้าคุณสร้าง UIRefreshControl ภายในวิธีloadViewของ viewController ทุกอย่างทำงานได้ดี UIRefreshControl ทำงานตามที่ควรจะเป็น ทดสอบกับ iOS 7.1 และ iOS 8.2


-1

ฉันสิ้นสุดการใช้ODRefreshControl ไม่จำเป็นต้องแฮ็คใด ๆ ข้างต้นใช้tableView.backgroundView = refreshControlงานได้ในลักษณะเดียวกันและให้ UI ที่ดูดีขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.