Ich habe ein seltsames Problem UITableView
nur mit iOS 7.
UITableViewCellSeparator
verschwindet über der ersten Reihe und unter der letzten Reihe. Manchmal wird es nach Auswahl der Zeilen oder einiger Bildlaufaktionen angezeigt.
In meinem Fall tableView
wird aus dem Storyboard
with UITableViewStylePlain
style geladen . Das Problem liegt sicherlich nicht in UITableViewCellSeparatorStyle
, was nicht von der Standardeinstellung geändert wird UITableViewCellSeparatorStyleSingleLine
.
Wie ich in den Apple Dev Forums ( hier und hier ) gelesen habe, haben andere Leute ein solches Problem und es werden einige Problemumgehungen gefunden, zum Beispiel:
Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.
Aber ich suche immer noch nach dem Grund für dieses seltsame Verhalten des Trennzeichens.
Irgendwelche Ideen?
Update: Wie ich in XCode 5.1 DP und iOS 7.1 Beta gesehen habe, hat Apple versucht, dieses Problem zu beheben. Jetzt wird das Trennzeichen nach Bedarf manchmal unterhalb der letzten Zeile angezeigt, nach einigen Aktualisierungen, jedoch nicht nach der Erstellung der Tabellenansicht.
Antworten:
Ich habe die Unteransichtshierarchie der betroffenen Zellen gelöscht und festgestellt, dass die
_UITableViewCellSeparatorView
auf ausgeblendet gesetzt wurde. Kein Wunder, dass es nicht gezeigt wird!Ich habe
layoutSubviews
in meinerUITableViewCell
Unterklasse überschrieben und jetzt werden die Trennzeichen zuverlässig angezeigt:Ziel-C :
Swift :
Die anderen hier vorgeschlagenen Lösungen funktionierten für mich nicht konsistent oder schienen klobig (Hinzufügen von benutzerdefinierten 1-Pixel-Fußzeilenansichten).
quelle
Das hat bei mir funktioniert:
quelle
Ich hatte auch das Problem mit Separator fehlt und ich fand heraus , dass das Problem nur auftrat , wenn
heightForRowAtIndexPath
wurde eine Dezimalzahl Rückkehr . Lösung:quelle
Haben Sie versucht, eine UIView der Höhe 1 in der Kopf- und Fußzeile der Tabelle mit hellgrauer Hintergrundfarbe hinzuzufügen? Grundsätzlich wird es das erste und letzte Trennzeichen verspotten.
quelle
@samvermette
Ich habe das Problem mithilfe dieser Delegatenmethoden behoben. Jetzt flackert es nicht:
quelle
Dieses Problem ist in unserer App aufgetreten. Wenn der Benutzer eine Zelle auswählte, wurde eine neue Tabellenansicht auf den Navigationscontrollerstapel verschoben, und als der Benutzer sie ablegte, fehlte das Trennzeichen. Wir haben es gelöst, indem wir
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
diedidSelectRowAtIndexPath
Delegate-Methode für die Tabellenansicht eingefügt haben.quelle
self.tableView.allowsMultipleSelection = NO;
?Hier ist eine einfachere (wenn auch etwas unübersichtliche) Problemumgehung, falls Sie eine benötigen. Versuchen Sie, die Zelle auszuwählen und die Auswahl aufzuheben, nachdem die Daten neu geladen und die Standardanimation ausgeführt wurde.
einfach hinzufügen:
quelle
Ich habe festgestellt, dass die einfachste Lösung darin besteht, nach dem erneuten Laden einer Zelle auch die oben genannte Zelle neu zu laden:
quelle
Eine einfache und saubere Lösung, die sowohl auf iOS 8 als auch auf iOS 9 (Beta 1) funktioniert.
Hier ist eine einfache, saubere und nicht aufdringliche Problemumgehung. Dabei wird eine Kategoriemethode aufgerufen, mit der die Trennzeichen behoben werden.
Alles, was Sie tun müssen, ist, die Hierarchie der Zelle zu durchlaufen und das Trennzeichen zu entfernen. So was:
Ich empfehle, dies einer Kategorie in UITableViewCell wie folgt hinzuzufügen:
Da das Trennzeichen in einer anderen als der aktuell ausgewählten Zelle verschwinden kann, ist es wahrscheinlich eine gute Idee, diesen Fix für alle Zellen in der Tabellenansicht aufzurufen . Dazu können Sie UITableView eine Kategorie hinzufügen, die folgendermaßen aussieht:
Mit dieser
-fixSeparatos
Option können Sie Ihre tableView direkt nach der Aktion aufrufen, durch die sie verschwinden. In meinem Fall war es nach dem Anruf[tableView beginUpdates]
und[tableView endUpdates]
.Wie eingangs erwähnt, habe ich dies sowohl auf iOS 8 als auch auf iOS 9 getestet. Ich gehe davon aus, dass es auch unter iOS 7 funktioniert, aber ich habe dort keine Möglichkeit, es zu versuchen. Wie Sie wahrscheinlich wissen, spielt dies mit den Interna der Zelle herum, sodass es in einer zukünftigen Version möglicherweise nicht mehr funktioniert. Und Apple könnte Ihre App theoretisch (mit einer Wahrscheinlichkeit von 0,001%) aus diesem Grund ablehnen, aber ich kann nicht sehen, wie sie überhaupt herausfinden können, was Sie dort tun (das Überprüfen des Suffix einer Klasse kann von statischen Analysatoren nicht als etwas erkannt werden schlecht, IMO).
quelle
Basierend auf dem Kommentar von @ ortwin-gentz funktioniert diese Lösung für mich in iOS 9.
(SWIFT-Code)
Ich benutze die Funktion fixCellsSeparator () nach dem Aufruf endUpdates () in einigen Methoden meiner tableView, zum Beispiel:
Ich hoffe, diese Lösung ist für jemanden hilfreich!
quelle
Ergänzung zur Antwort von airpaulg.
Grundsätzlich muss man also zwei UITableDelegate-Methoden implementieren. Hier ist meine Lösung, die sowohl auf iOS7 als auch auf iOS6 funktioniert.
// Dadurch wird das leere Tabellenraster unter den Zellen ausgeblendet, wenn sie nicht den gesamten Bildschirm abdecken
quelle
Dies hat das Problem für mich behoben:
Stellen Sie sicher
clipsToBounds
, dass für die Zelle JA, für die Zelle jedoch NEIN festgelegt istcontentView
. Auch eingestelltcell.contentView.backgroundColor = [UIColor clearColor];
quelle
Dieses Problem scheint sich unter so vielen Umständen zu manifestieren.
Für mich hatte das etwas mit der Zellauswahl zu tun. Ich habe keine Ahnung warum und hatte keine Zeit, mich zu tief damit zu beschäftigen, aber ich kann sagen, dass es begann, als ich die Zelle
selectionStyle
auf keine stellte. dh:Ich habe versucht, einige der oben genannten Delegate-Methoden zu verwenden, um die
separatorStyle
Eigenschaft von ein- und auszuschaltentableView
aber sie schienen nichts zu tun, um mein Problem zu beheben.Der ganze Grund, warum ich das brauchte, war, dass ich nicht einmal die Zellauswahl brauchte.
Also habe ich etwas gefunden, das für mich funktioniert hat. Ich habe gerade die Auswahl auf dem deaktiviert
UITableView
:Hoffe, das hilft jemandem, wenn Sie keine Zellauswahl benötigen.
quelle
Ich habe versucht, so viele Vorschläge zu beheben, kann das aber nicht beheben. Schließlich habe ich mich für eine benutzerdefinierte Trennlinie wie folgt entschieden:
P / S: Benutzerdefiniert bei willDisplayCell NICHT cellForRowAtIndexPath
quelle
Es ist ziemlich überraschend, dass das
separatorInset
Hin- und Herwechseln des Zellenwerts funktioniert:quelle
Ich hatte auch das Problem dieser inkonsistenten Trennlinienanzeige am unteren Rand meiner UITableView. Mithilfe einer benutzerdefinierten Fußzeilenansicht konnte ich eine ähnliche Linie erstellen und über der potenziell vorhandenen (die manchmal fehlte) anzeigen.
Das einzige Problem dieser Lösung ist, dass Apple eines Tages die Dicke der Linie ändern kann
quelle
Ich habe beschlossen, diese Codezeilen dort einzufügen, wo die Aktualisierung der Tabellenansicht stattfindet:
Zum Beispiel habe ich sie in meinem Fall hier geputtet:
quelle
Sie müssen eine Zellenauswahl entfernen, bevor Sie die Zellen aktualisieren. Dann könnten Sie die Auswahl wiederherstellen.
quelle
Fügen Sie in viewDidLoad eine leere Fußzeile hinzu, um das oben genannte Problem zu beheben.
Verwenden Sie die obigen Zeilen nicht in der delegate-Methode viewForFooterInSection. Mittel Implementieren Sie die viewForFooterInSection-Methode nicht.
quelle
Airpaulg Antwort zu erweitern, weil es für mich nicht ganz funktioniert hat ..
Ich musste auch die heightforfooter-Methode implementieren, um die Höhe zu erhalten
dann bemerkte ich, dass die hellgraue Farbe zu dunkel ist. Ich habe dies behoben, indem ich die aktuelle Trennfarbe der Tabellenansicht abgerufen und Folgendes verwendet habe:
UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];
quelle
Ich bin auch in unserem Projekt auf dieses Problem gestoßen. Meine Tabellenansicht hatte eine tableFooterView, die dies ermöglichen könnte. Ich habe festgestellt, dass das Trennzeichen unter der letzten Zeile angezeigt wird, wenn ich diese tableFooterView entfernt habe.
quelle
Was für mich den Unterschied ausmachte, war das Neuladen der Zeile, für die die untere Trennlinie nicht angezeigt werden würde:
quelle
Ich löse dieses Problem auf eine andere Weise: Fügen Sie in tableview.tableFooterView als Unterebene eine Ebene mit einer Höhe von 0,5 Pixel und einer hellgrauen Farbe hinzu.
Der Code ist einfach so:
quelle
Implementieren Sie in Ihrer UITableViewCell-Unterklasse layoutSubviews und fügen Sie Folgendes hinzu:
quelle
Wie bereits erwähnt, scheint sich dieses Problem auf verschiedene Weise zu manifestieren. Ich habe mein Problem mithilfe der folgenden Problemumgehung behoben:
quelle
Ich ging die Antworten und Lösungen durch und fand solche Beobachtungen:
Dies scheint sowohl in iOS 7 als auch in iOS 8 problematisch zu sein. Ich habe das Problem bei der Auswahl der Zelle aus dem Code in bemerkt
viewDidLoad
Methode :1) Problemumgehung war,
viewDidAppear:
wenn jemand die merkliche Verzögerung zwischen der Präsentation der Ansicht und der Auswahl der Zelle nicht stört2) Die zweite Lösung hat bei mir funktioniert, aber der Code sieht etwas fragil aus, da er auf der internen Implementierung von basiert
UITableViewCell
3) Das Hinzufügen eines eigenen Trennzeichens scheint derzeit am flexibelsten und besten zu sein, erfordert jedoch mehr Codierung :)
quelle
Das Einstellen des Stils
viewWillAppear
hat bei mir funktioniert.quelle
Da dies immer noch ein Problem mit IOS 8 ist, werde ich meine Lösung in Swift hinzufügen. Setzen Sie die Trennlinie für die Tabellenansicht auf keine. Fügen Sie diesen Code dann der Delegatenmethode cellForRowAtIndexPath hinzu. Es wird ein schönes Trennzeichen hinzugefügt. Mit der if-Anweisung können Sie entscheiden, welche Zellen ein Trennzeichen haben sollen.
quelle
Hier ist meine Lösung für dieses Problem. Nachdem Sie Ihre Zelle (n) eingefügt haben, laden Sie den Abschnitt neu. Wenn Ihnen das Neuladen des gesamten Abschnitts zu intensiv ist, laden Sie einfach die Indexpfade oben und unten neu.
quelle
Als ich auf ein ähnliches Problem stieß, stellte ich fest, dass eine andere gute Lösung, insbesondere wenn Ihre dataSource nicht groß ist, darin besteht, die tableData beim Implementieren der
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
Methode neu zu laden. Hier ein Beispiel:Sie können auch nicht sichtbare Daten basierend auf der sichtbaren Datenquelle neu laden, dies erfordert jedoch etwas mehr Hacking.
Beachten Sie, dass diese Delegatenfunktion unter das
UITableViewDelegate
Protokoll fällt !Ich hoffe es hilft!
quelle