Ciekawe, ponieważ nie wydaje się to od razu możliwe, ale czy istnieje sprytny sposób na wykorzystanie nowej UIRefreshControl
klasy iOS 6 bez korzystania z UITableViewController
podklasy?
I często używać UIViewController
z UITableView
podrzędny i zgodne UITableViewDataSource
i UITableViewDelegate
zamiast używać UITableViewController
wprost.
UITableViewController
i zgłosić błąd żądania API używanieUIRefreshControl
zUITableView
bezpośrednio.Odpowiedzi:
Na przeczucie i na podstawie inspiracji DrummerB, próbowałem po prostu dodać
UIRefreshControl
instancję jako subview do mojegoUITableView
. I to magicznie po prostu działa!To dodaje
UIRefreshControl
widok powyżej tabeli i działa zgodnie z oczekiwaniami bez konieczności używaniaUITableViewController
:)EDYCJA: Powyższe nadal działa, ale jak niektórzy zauważyli, istnieje niewielkie „zacinanie się” podczas dodawania UIRefreshControl w ten sposób. Rozwiązaniem tego jest utworzenie instancji UITableViewController, a następnie ustawienie na to UIRefreshControl i UITableView, tj .:
źródło
-[UITableViewController setRefreshControl:]
) będzie nadal działać.handleRefresh:
następuje nieoczekiwana zmiana wartości widoków przewijaniacontentInsets
na ułamek sekundy. Czy ktoś jeszcze tego doświadczył lub ma na to jakieś rozwiązanie? (tak, wiem, że nie jest to obsługiwane!)UITableViewController
a będziesz „robić to dobrze”.[_tableView insertSubview:_refreshControl atIndex:0];
. Testowane zarówno z iOS 7, jak i 8;)Aby wyeliminować jąkanie spowodowane zaakceptowaną odpowiedzią, możesz przypisać ją
UITableView
doUITableViewController
.EDYTOWAĆ:
Sposób na dodanie opcji „
UIRefreshControl
bez”UITableViewController
bez zacinania się i zachowanie ładnej animacji po odświeżeniu danych w widoku tabeli.Później podczas obsługi odświeżonych danych ...
źródło
[_tablewViewController didMoveToParentViewController:self];
po dodaniu widoku podrzędnego.self.tableView = _tableViewController.tableView;
powinno być_tableViewController.tableView = self.tableView
Spróbuj użyć widoku kontenera wewnątrz używanego ViewController. możesz zdefiniować czystą podklasę UITableViewController z dedykowanym widokiem tabeli i umieścić ją w ViewController.
źródło
self.childViewControllers.firstObject
.prepareForSegue
aby uzyskać odwołanie do obiektu UITableViewController w widoku kontenera, ponieważ jest on natychmiast wyzwalany jako zdarzenie segue po utworzeniu wystąpienia z storyboardu.Cóż, UIRefreshControl jest podklasą UIView, więc możesz jej używać samodzielnie. Nie jestem jednak pewien, jak to się renderuje. Renderowanie może po prostu zależeć od ramki, ale może również zależeć od UIScrollView lub UITableViewController.
Tak czy inaczej, będzie to bardziej hack niż eleganckie rozwiązanie. Polecam zajrzeć do jednego z dostępnych klonów stron trzecich lub napisać własny.
ODRefreshControl
SlimeRefresh
źródło
Spróbuj opóźnić wywołanie
-endRefresh
metody refreshControl o ułamek sekundy po ponownym załadowaniu zawartości tableView przez użycie NSObject-performSelector:withObject:afterDelay:
lub GCDdispatch_after
.W tym celu utworzyłem kategorię na UIRefreshControl:
Przetestowałem to i działa to również w widokach kolekcji. Zauważyłem, że opóźnienie tak małe jak 0,01 sekundy wystarczy:
źródło
UIRefreshControl
.[self performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.01]
-performSelector:withObject:afterDelay:
czy GCD, zależy od osobistego gustu.To proste
Jeśli chcesz dowiedzieć się o iOS 10 UIRefreshControl przeczytaj tutaj .
źródło
Dodanie kontrolki odświeżania jako widoku podrzędnego tworzy pustą przestrzeń nad nagłówkami sekcji.
Zamiast tego osadziłem UITableViewController w moim UIViewController, a następnie zmieniłem moją
tableView
właściwość, aby wskazywała na osadzoną i viola! Minimalne zmiany kodu. :-)Kroki:
@IBOutlet weak var tableView: UITableView!
na nowy z wbudowanego UITableViewController, jak pokazano poniżejźródło
Dla Swift 2.2.
Najpierw wykonaj UIRefreshControl ().
W metodzie viewDidLoad () dodaj:
I wykonaj funkcję odświeżania
źródło
Oto inne rozwiązanie, które jest trochę inne.
Musiałem go użyć z powodu pewnych problemów z hierarchią widoków, które miałem: tworzyłem funkcjonalność, która wymagała przekazywania widoków do różnych miejsc w hierarchii widoków, które uległy uszkodzeniu podczas korzystania z widoku tabeli UITableViewController b / c tableView to widok główny UITableViewController ( self.view), a nie tylko zwykły widok, stworzył niespójne hierarchie kontrolera / widoku i spowodował awarię.
Zasadniczo utwórz własną podklasę UITableViewController i przesłonić loadView, aby przypisać self.view inny widok i przesłonić właściwość tableView, aby zwrócić osobny widok tabeli.
na przykład:
W połączeniu z rozwiązaniem Kellera będzie to bardziej niezawodne w tym sensie, że tableView jest teraz zwykłym widokiem, a nie widokiem głównym VC, i będzie bardziej odporny na zmianę hierarchii widoków. Przykład użycia w ten sposób:
Istnieje inne możliwe zastosowanie:
Ponieważ podklasowanie w ten sposób oddziela self.view od self.tableView, możliwe jest teraz używanie tego UITableViewController jako bardziej zwykłego kontrolera i dodawanie innych widoków podrzędnych do self.view bez osobliwości dodawania widoków podrzędnych do UITableView, więc można rozważyć zrobienie ich przeglądaj kontrolery bezpośrednio podklasę UITableViewController zamiast mieć potomne UITableViewController.
Niektóre rzeczy, na które należy uważać:
Ponieważ zastępujemy właściwość tableView bez wywoływania super, mogą być pewne rzeczy, na które należy uważać i w razie potrzeby należy je obsłużyć. Na przykład ustawienie widoku tabeli w powyższym przykładzie nie doda widoku tabeli do self.view i nie ustawi ramki, którą możesz chcieć zrobić. Ponadto w tej implementacji nie ma domyślnego widoku tabeli podczas tworzenia instancji klasy, co można również rozważyć dodanie. Nie uwzględniam go tutaj, ponieważ tak jest w każdym przypadku, a to rozwiązanie faktycznie dobrze pasuje do rozwiązania Kellera.
źródło
Spróbuj tego,
Powyższe rozwiązania są w porządku, ale tableView.refreshControl jest dostępny tylko dla UITableViewController, aż do iOS 9.xi jest dostępny w UITableView od iOS 10.x.
Napisane w Swift 3 -
źródło
Pierwsza sugestia Kellera powoduje dziwny błąd w iOS 7, w którym wstawka tabeli jest zwiększana po ponownym pojawieniu się kontrolera widoku. Przejście na drugą odpowiedź za pomocą kontrolera uitableview naprawiło dla mnie pewne rzeczy.
źródło
Okazuje się, że można użyć następujących opcji, gdy używa się UIViewController z widokiem podrzędnym UITableView i jest on zgodny z UITableViewDataSource i UITableViewDelegate:
źródło
self.refreshControl
jest własnością, aUITableViewController
nieUIViewController
.