2012-10-09 21 views
6

Uygulamamda UIRefreshControl uygulamasını denemeye çalışıyorum. Bir xib dosyası var ve boş birleştirme dosyası için UITableViewController ekledim ve yenileme özelliğini "etkin" olarak ayarladım. Ayrıca viewDidLoad ve özel bir yenileme yöntemine kod ekledim. Sorun benim viewDidLoad ben "türü ViewController nesnesi bulunmayan Mülkiyet 'refreshControl'" olsun ben .... ben herhangi bir bilgi bulamıyorum bir hata var olduğunu UIRefreshControl sorunları

- (void)viewDidLoad{ 

[super viewDidLoad]; 

self.myTableView = 
[[UITableView alloc] initWithFrame:self.view.bounds 
          style:UITableViewStyleGrouped]; 

self.myTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | 
            UIViewAutoresizingFlexibleHeight; 

self.myTableView.delegate = self; 
self.myTableView.dataSource = self; 

[self.view addSubview:self.myTableView]; 

UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"]; 
[refresh addTarget:self action:@selector(refreshView:) forControlEvents:UIControlEventValueChanged]; 

self.refreshControl = refresh; 

} 

-(void)refreshView:(UIRefreshControl *)refresh { 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."]; 

// custom refresh logic would be placed here... 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"MMM d, h:mm a"]; 
NSString *lastUpdated = [NSString stringWithFormat:@"Last updated on %@", 
           [formatter stringFromDate:[NSDate date]]]; 

refresh.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdated]; 
[refresh endRefreshing]; 

} 

Hiçbir fikrim neden var özellik mevcut değil .... ne eksik?

dosyamdan ViewController.h dosyamda kaleme almam gerekiyor. Zaten UITableView varsa, her ikisinden de mi kalırım? Ben ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>ViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> için benim kodunu değiştirmek o zaman bir hata alıyorum:

error: NSInternalInconsistencyException', 
    reason: '-[UITableViewController loadView] loaded the "ViewController_iPhone" nib but didn't get a UITableView.' 

cevap

11

Sen UITableView bir subview UIRefreshControl ekleyebilir.

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

Dave'in yorumuna göre, bu iOS'un gelecekteki sürümlerinde kesintiye neden olabilir. Bu yüzden bunu kullanırken dikkatli olun ve bununla ilgili olarak bug report to apple'u yükseltmeye çalışın.

Güncelleme: Daha iyi bir yaklaşım self bir ChildViewController olarak UITableViewController eklenmesi ve daha sonra self.view ait subview tableViewController.tableView eklemektir. Bu şekilde çalışması için herhangi bir hack yapmak zorunda değilsiniz.

[self addChildViewController:tableViewController]; 
[self.view addSubview:tableViewController.tableView]; 

buna göre tableView için çerçeve tanımlayabilir. Bu yaklaşımı kullanarak, UIRefreshControl, UITableViewController için çalıştığı şekilde çalışmalıdır. `

+3

Bu desteklenmiyor ve iOS'un sonraki sürümlerinde kırılabilir. Bir UIRefreshControl kullanmanın tek desteklenen yolu bir "UITableViewController" ile. –

+1

@ACB, tam ihtiyacım olan şey budur! Milyonlarca teşekkür ederim. Keşke sana daha fazla sahne verebilseydim! – brianhevans

+1

Evet, el ile eklediğiniz bir UITableView ve ile bir UIViewController sınıfında bir UIRefreshControl olabilir. Diğer cevapların yorumları doğru olabilir (dokümanlarla birlikte olmaz), ancak bu küçük kesmek iOS6'da çalışır. –

1

Sizin ViewController sınıf refreshControl mülke erişimi için UITableViewController bir alt sınıfı olmalıdır.

+0

"UITableViewController" öğesini bir alt görünüm denetleyicisi olarak ekleyebilir ve ardından "tableview" öğesini mevcut görünüm denetleyicisinin "self.view" alt görünümü olarak ekleyebiliriz, değil mi? Sadece alt sınıfa ihtiyacımız olup olmadığını mı merak ediyordum? – iDev

+0

@ACB Evet, bir "UITableViewController" öğesini bir alt görünüm denetleyicisi olarak kullanabilirsiniz. Bu mükemmel bir yaklaşım. –

+0

Onaylama için teşekkürler. Cevabınızda bu ifadeyle karıştırıldım *** "ViewController sınıfı UITableViewController'ın bir alt sınıfı olmalı" ***. – iDev

5

Unutmamanız Gerekenler:

  • UIRefreshControl sadece UITableViewController için, bu nedenle sınıf UITableViewController alt sınıfı olmalıdır.

  • UITableViewController bir özelliğe refreshControl vardır, bir UIRefreshControl tahsis ve o mülke olarak ayarlayın gerekir.

Ör:

UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; 

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 

[refreshControl addTarget:self action:@selector(refreshControlAction:) forControlEvents:UIControlEventValueChanged]; 

tableViewController.refreshControl = refreshControl; 
+0

Doğru cevap budur. Bunu kabul edilen yanıtlara göre "UITableView" öğesine manuel olarak eklemek, iOS'un gelecekteki sürümlerinde beklenmedik davranışlara neden olabilir. – Samah

0

Sana myTableView için ayrı UITableViewController Subclass yapmak öneriyoruz. Ve sonra özgün ViewController içinde bu sınıfı eklemek için addChildviewController veya iOS6 ContainerView kullanarak. Bu şekilde View kısmında bile UIRefreshControl kullanabilirsiniz.

Kabul edilen cevap resmi bir yol değildir, bu yüzden yorumların geleceği gibi gelecekteki sürümlerde kırılabilir ...

2

Tüm bunlar basit bir şey yapmanın karmaşık yolları.

Bir yenileme denetimi eklemenize veya viewController'da bir tane bildirmenize gerek yoktur. Yenilemek için çek ekleme, iki adımlı bir işlemdir.
Adım 1: Hikaye tablonuzda, tablonuzun ViewViewController bölümüne gidiniz ve "Yenileyici" yazan yerde "Etkin" seçeneğini seçiniz.
Adım 2: viewDidLoad, sizin tableViewController.m dosyasına aşağıdaki kodu ekleyin: -refresh yöntemde şeyler yapmaya dışındaki tüm süreci, var

[self.refreshControl addTarget:self 
          action:@selector(refresh) 
        forControlEvents:UIControlEventValueChanged]; 

. Yenilemeyi durdurmak istediğinizde [self.refreshControl endRefreshing];'u arayın.

+0

Teşekkürler! Okuduğum tüm derslerin aşırı derecede karmaşık olduğunu hissetmiştim. –