2012-10-09 8 views
6

Próbuję wdrożyć UIRefreshControl w mojej aplikacji. Mam plik xib i dodałem UITableViewController do pustego pliku nib i ustawiłem właściwość refresh na "enabled". Dodałem również kod do viewDidLoad i niestandardową metodę odświeżania. Problemem jest to, mam błąd nie mogę znaleźć żadnych informacji na temat .... w moim viewDidLoad uzyskać „obiekt«refreshControl»nie został odnaleziony na obiekcie typu ViewControllerUIRefreshControl issues

- (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]; 

} 

Nie mam pojęcia, dlaczego tak właściwość nie jest dostępna .... czego mi brakuje?

Wygląda na to, że muszę dziedziczyć po UITableViewController w moim pliku ViewController.h. Jeśli mam już UITableView, jak mogę dziedziczyć z obu? Jeśli mogę zmienić kod z ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> do ViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> następnie pojawia się błąd:

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

Odpowiedz

11

Możesz dodać UIRefreshControl jako podrzędny do UITableView.

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

Zgodnie z komentarzem Dave'a może to pęknąć w przyszłej wersji systemu iOS. Dlatego należy zachować ostrożność podczas korzystania z tego i próbować podnieść w związku z tym bug report to apple.

Aktualizacja: Lepszym rozwiązaniem jest dodanie UITableViewController jako ChildViewController z self a następnie dodając tableViewController.tableView jako podrzędny z self.view. Nie musisz robić żadnych hacków, aby to działało w ten sposób.

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

Można zdefiniować ramy dla tableView odpowiednio. Korzystając z tego podejścia, UIRefreshControl powinno działać w taki sam sposób, jak działa dla UITableViewController. `

+3

Jest to nieobsługiwane i może zostać złamane w przyszłej wersji systemu iOS. Jedynym obsługiwanym sposobem użycia 'UIRefreshControl' jest z' UITableViewController'. –

+1

@ACB, dokładnie to, czego potrzebowałem !!! Dzięki za miliony. Chciałbym móc dać ci więcej rekwizytów! – brianhevans

+1

Tak, możesz mieć UIRefreshControl na klasie UIViewController z UITableView i , które zostały dodane ręcznie. Komentarze inne odpowiedzi mogą być prawdziwe (nie jest to zgodne z dokumentami), ale ten mały hack działa na iOS6. –

1

Twoja klasa ViewController musi być podklasą UITableViewController, aby mieć dostęp do właściwości refreshControl.

+0

Możemy dodać 'UITableViewController' jako kontroler widoku podrzędnego, a następnie dodać' tableview' jako widok "self.view" bieżącego kontrolera widoku, prawda? Właśnie zastanawiałem się, czy naprawdę potrzebujemy podklasy? – iDev

+0

@ACB Tak, możesz użyć 'UITableViewController' jako kontrolera widoku podrzędnego. To doskonałe podejście. –

+0

Dzięki za potwierdzenie. Byłem zdezorientowany tym stwierdzeniem w twojej odpowiedzi *** "Klasa ViewController musi być podklasą UITableViewController" ***, ponieważ możemy dodać ją jako widok podrzędny. – iDev

5

Rzeczy do zapamiętania:

  • UIRefreshControl tylko dla UITableViewController, więc klasa powinna być podklasą UITableViewController.

  • UITableViewController ma właściwość refreshControl należy przeznaczyć UIRefreshControl i ustawić ją na tej nieruchomości.

Ex:

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

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

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

tableViewController.refreshControl = refreshControl; 
+0

To jest poprawna odpowiedź. Ręczne dodanie go do "UITableView" zgodnie z zaakceptowaną odpowiedzią może spowodować nieoczekiwane zachowanie w przyszłych wersjach systemu iOS. – Samah

0

polecam Ci zrobić oddzielny UITableViewController Podklasa dla myTableView. A następnie za pomocą addChildviewController lub iOS6 ContainerView, aby dodać tę klasę w oryginalnym ViewController. W ten sposób nawet w części View możesz użyć UIRefreshControl.

Przyjęta odpowiedź nie jest oficjalna, więc może zostać przerwana w przyszłym wydaniu, ponieważ komentarz ...

2

Wszystko to są złożone sposoby robienia czegoś prostego.

Nie trzeba dodawać formantu odświeżania ani deklarować go w swoim kontrolerze viewController. Dodawanie pull-to-refresh jest procesem dwuetapowym.
Krok 1: W scenorysie przejdź do tableViewController i tam, gdzie jest napisane "Odświeżanie", wybierz "Włączone".
Krok 2: Dodaj następujący kod do pliku tableViewController.m w viewDidLoad:

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

to cały proces, inne niż robienie rzeczy w -refresh metody. Jeśli chcesz przestać odświeżać, zadzwoń pod numer [self.refreshControl endRefreshing];.

+0

Dzięki! Miałem przeczucie, że wszystkie tutoriale, które czytałem, były zbyt skomplikowane. –