Buduję czytnik RSS za pomocą programu fast i muszę zaimplementować funkcję pull, aby ponownie załadować.
Oto jak próbuję to zrobić.
class FirstViewController: UIViewController,
UITableViewDelegate, UITableViewDataSource {
@IBOutlet var refresh: UIScreenEdgePanGestureRecognizer
@IBOutlet var newsCollect: UITableView
var activityIndicator:UIActivityIndicatorView? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.newsCollect.scrollEnabled = true
// Do any additional setup after loading the view, typically from a nib.
if nCollect.news.count <= 2{
self.collectNews()
}
else{
self.removeActivityIndicator()
}
view.addGestureRecognizer(refresh)
}
@IBAction func reload(sender: UIScreenEdgePanGestureRecognizer) {
nCollect.news = News[]()
return newsCollect.reloadData()
}
Staje się :
Właściwość „self.refresh” nie została zainicjowana przy wywołaniu super.init
Pomóż mi zrozumieć zachowanie osób rozpoznających gesty. Świetnie pomoże działający przykładowy kod.
Dzięki.
ios
swift
xcode
uirefreshcontrol
xrage
źródło
źródło
Odpowiedzi:
Pull to refresh jest wbudowany w iOS. Możesz to zrobić w szybki sposób
W pewnym momencie możesz zakończyć odświeżanie.
źródło
Rozwiązanie z storyboardem i szybkim ...
1.) Otwórz plik .storyboard, wybierz TableViewController w swojej serii ujęć i „Włącz” Kontrolę widoku tabeli - Odświeżanie w Narzędziach.
2.) Otwórz powiązaną klasę UITableViewController i dodaj następujący wiersz do metody viewDidLoad.
Edytowane dla Swift 5.0:
LUB w Swift 2.2:
3.) Dodaj następującą metodę nad metodą viewDidLoad
źródło
put self.tableView.reloadData()
iself.refreshControl?.endRefreshing()
oddzwonić?reloadData()
w głównej kolejce, aby natychmiast odświeżyć interfejs użytkownika:dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() });
Chciałbym wspomnieć o funkcji PRETTY COOL , która jest dostępna od iOS 10, a mianowicie:
Na razie UIRefreshControl jest bezpośrednio obsługiwany w każdym
UICollectionView
,UITableView
iUIScrollView
!Każdy z tych widoków ma właściwość instancji refreshControl , co oznacza, że nie ma już potrzeby dodawania go jako widoku podrzędnego w widoku przewijania , wystarczy:
Osobiście uważam, że bardziej naturalne jest traktowanie go jako właściwości widoku przewijania niż dodawanie go jako widoku podrzędnego, szczególnie dlatego, że jedynym odpowiednim widokiem, który może być nadzorem dla UIRefreshControl, jest widok przewijania, tzn. Funkcjonalność używania UIRefreshControl jest tylko przydatne podczas pracy z widokiem przewijania; Dlatego takie podejście powinno być bardziej oczywiste przy konfigurowaniu widoku sterowania odświeżaniem.
Nadal masz jednak możliwość korzystania z wersji
addSubview
opartej na systemie iOS:źródło
doSomething
funkcji, jeśli jest osiągalny, musisz sprawdzić kod.Szybki 4
I możesz przestać odświeżać za pomocą:
źródło
tableView.reloadData()
w swoim przykładzie!var refControl: UIRefreshControl{ let rfControl = UIRefreshControl() rfControl.attributedTitle = NSAttributedString(string: "") rfControl.tintColor = UIColor(red:0.16, green:0.68, blue:0.9, alpha:1) rfControl.addTarget(self, action: #selector(getNewMessageList), for: .valueChanged) return rfControl }
. Następnie wywołaj endRefreshing (), to nie działa (odświeżanie nadal tam pokazuje), ale podążaj swoją drogą, działało, daj mi znać dlaczego?.valueChanged
zdarzenie? Nie rozumiem tego połączenia.W Swift użyj tego,
Jeśli chcesz pobrać w celu odświeżenia w WebView,
Więc wypróbuj ten kod:
źródło
Odpowiedź Anhila bardzo mi pomogła.
Jednak po dalszych eksperymentach zauważyłem, że sugerowane rozwiązanie czasami powoduje niezbyt ładną usterkę interfejsu użytkownika .
Zamiast tego skorzystanie z tego podejścia * załatwiło sprawę.
* Swift 2.1
źródło
Błąd mówi ci, że
refresh
nie został zainicjowany. Zauważ, że wybrałeś opcjęrefresh
nieobowiązkową, co w Swift oznacza, że musi ona mieć wartość przed wywołaniemsuper.init
(lub jest domyślnie wywołana, co wydaje się być twoim przypadkiem). Wybierzrefresh
opcjonalne (prawdopodobnie to, czego chcesz) lub zainicjuj w jakiś sposób.Sugerowałbym ponowne przeczytanie dokumentacji wprowadzającej Swift, która omawia to bardzo szczegółowo.
Ostatnia rzecz, nie będąca częścią odpowiedzi, jak wskazał @Anil, ma wbudowaną funkcję ściągania w celu odświeżenia kontroli w iOS o nazwie
UIRefresControl
, która może być czymś, na co warto zwrócić uwagę.źródło
Zbudowałem aplikację kanału RSS, w której mam funkcję odświeżania Pull To, która pierwotnie miała niektóre z wyżej wymienionych problemów.
Ale aby dodać do powyższych odpowiedzi użytkowników, szukałem wszędzie mojego przypadku użycia i nie mogłem go znaleźć. Ściągałem dane z Internetu (RSSFeed) i chciałem ściągnąć na stół Widok historii do odświeżenia.
To, co wspomniano powyżej, obejmuje właściwe obszary, ale z niektórymi problemami, jakie mają ludzie, oto co zrobiłem i działa to na ucztę:
Przyjąłem podejście @Blankarsch i poszedłem do mojej main.storyboard i wybrałem widok tabeli, aby użyć odświeżenia, a następnie nie wspomniano o utworzeniu IBOutlet i IBAction, aby efektywnie korzystać z odświeżania
Mam nadzieję, że to pomoże każdemu w takiej samej sytuacji jak ja
źródło
źródło
Detale
cechy
Rozwiązanie
Stosowanie
Pełna próbka
źródło
Szybki 5
źródło
Proponuję zrobić rozszerzenie pull To Refresh do użycia w każdej klasie.
1) Utwórz pusty plik szybki: Plik - Nowy - Plik - Szybki plik.
2) Dodaj następujące
3) W widoku kontrolera wywołaj te metody jako:
4) W pewnym momencie chciałeś zakończyć odświeżanie:
źródło
Do ściągnięcia w celu odświeżenia używam
DGElasticPullToRefresh
https://github.com/gontovnik/DGElasticPullToRefresh
Instalacja
pod „DGElasticPullToRefresh”
przesłonić widok funcWillAppear (_ animowane: Bool)
I nie zapomnij usunąć odniesienia, gdy widok zniknie
aby usunąć pull, aby odświeżyć, wstaw ten kod do swojego
przesłonić func viewDidDisappear (_ animated: Bool)
I to będzie wyglądać
Miłego kodowania :)
źródło
Możesz to osiągnąć za pomocą kilku wierszy kodu. Dlaczego więc utkniesz w bibliotece lub interfejsie użytkownika innej firmy? Pull to refresh jest wbudowany w iOS. Możesz to zrobić w szybki sposób
źródło
możesz użyć tej podklasy tableView:
1 - w narzędziu do tworzenia interfejsów zmień klasę tabeli Wyświetl
PullToRefreshTableView
lub utwórz plikPullToRefreshTableView
programowo2 - zaimplementuj
PullToRefreshTableViewDelegate
kontroler widoku3 -
tableViewDidStartRefreshing(tableView: PullToRefreshTableView)
zostanie wywołany w kontrolerze widoku, gdy widok tabeli zacznie się odświeżać4 - połączenie,
yourTableView.endRefreshing()
aby zakończyć odświeżanieźródło
W ten sposób sprawiłem, że działał za pomocą Xcode 7.2, co moim zdaniem jest poważnym błędem. Używam tego w moim
UITableViewController
wnętrzuviewWillAppear
Jak widać, dosłownie muszę wywołać tę
configureMessage()
metodę po skonfigurowaniu mojego,UIRefreshControl
a następnie kolejne odświeżenia będą działać dobrze.źródło
Inne odpowiedzi są poprawne, ale aby uzyskać więcej szczegółów, sprawdź ten post Pull to Refresh
Podczas pracy z UITableViewController rozwiązanie jest dość proste: Najpierw wybierz kontroler widoku tabeli w swojej serii ujęć, otwórz inspektor atrybutów i włącz odświeżanie:
UITableViewController jest wyposażony w odniesienie do UIRefreshControl po wyjęciu z pudełka. Musisz tylko połączyć kilka rzeczy, aby zainicjować i zakończyć odświeżanie, gdy użytkownik pociągnie w dół.
W zastąpieniu metody viewDidLoad () dodaj cel do obsługi odświeżania w następujący sposób:
refreshControl.endRefreshing()
Aby uzyskać więcej informacji, proszę wspomnieć o linku, a cały kredyt trafia na ten post
źródło