UITableViewCell Separator verschwindet in iOS7

129

Ich habe ein seltsames Problem UITableViewnur mit iOS 7.

UITableViewCellSeparatorverschwindet über der ersten Reihe und unter der letzten Reihe. Manchmal wird es nach Auswahl der Zeilen oder einiger Bildlaufaktionen angezeigt.

In meinem Fall tableViewwird aus dem Storyboardwith UITableViewStylePlainstyle 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.

BS
quelle
19
Manchmal habe ich das Gefühl, dass iOS7 so unreif ist. Dies und die lange Liste der Dinge, die ich hier habe, zeigen, wie weit iOS7 von der Perfektion früherer iOS entfernt ist.
Bms270
1
Die Einstellungen-App von Apple hat das gleiche Problem, daher glaube ich, dass dies ein iOS 7-Problem ist. Ich habe es gemeldet und in ihrem Follow-up haben sie nach Bildern gefragt, die das Problem zeigen.
Johan
@Gatada Wo in der Einstellungen-App sehen Sie das Problem?
Jamie Forrest
2
Das gleiche Problem wurde festgestellt und durch Hinzufügen von [cell setSeparatorInset: UIEdgeInsetsFromString (@ "1")] behoben. mit in (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath-Methode
Ayesha Fatima
1
Dies scheint in den iOS 8.0-Betas immer noch nicht der Fall zu sein. Ich habe das Radar 17724043 geöffnet, falls es jemandem etwas ausmachen sollte.
Andy Wilkinson

Antworten:

77

Ich habe die Unteransichtshierarchie der betroffenen Zellen gelöscht und festgestellt, dass die _UITableViewCellSeparatorViewauf ausgeblendet gesetzt wurde. Kein Wunder, dass es nicht gezeigt wird!

Ich habe layoutSubviewsin meiner UITableViewCellUnterklasse überschrieben und jetzt werden die Trennzeichen zuverlässig angezeigt:

Ziel-C :

- (void)layoutSubviews {
    [super layoutSubviews];

    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

Swift :

override func layoutSubviews() {
    super.layoutSubviews()

    guard let superview = contentView.superview else {
        return
    }
    for subview in superview.subviews {
        if String(subview.dynamicType).hasSuffix("SeparatorView") {
            subview.hidden = false
        }
    }
}

Die anderen hier vorgeschlagenen Lösungen funktionierten für mich nicht konsistent oder schienen klobig (Hinzufügen von benutzerdefinierten 1-Pixel-Fußzeilenansichten).

Ortwin Gentz
quelle
Ich habe Ihre Methode verwendet, aber nicht in der Unterklasse habe ich UITableViewCell eine Kategorie hinzugefügt. Es hat mir geholfen. Vielen Dank.
Vitalii Boiarskyi
Natürlich ist es auch in einer Kategorie möglich. Da dies ein Methoden-Swizzling erfordert, habe ich mich für den einfachen Unterklassen-Ansatz entschieden.
Ortwin Gentz
3
Dies ist die einzige Lösung, die für mich funktioniert hat. Mein Problem trat auf, wenn die UITableView genügend Zeilen hatte, um scrollbar zu sein. Dieser "hasSuffix:" - Teil ist allerdings ziemlich zerbrechlich.
juhan_h
Funktioniert bei mir. Vielleicht ist die Frage albern, aber wird nicht die private API verwendet?
Foriger
1
Funktioniert für mich in iOS9
tounaobun
42

Das hat bei mir funktioniert:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
Samvermette
quelle
Sie verdienen mehr Stimmen, genau das habe ich gebraucht. Ich habe es in eine Kategorie eingefügt. Wenn ich diesen Fehler mache (in meinem Fall tritt das ausgeblendete Fußzeilentrennzeichen wieder auf), rufe ich auf, nachdem ich [tableView reloadData] ausgeführt habe [tableView reloadSeparators];
NiñoScript
12

Ich hatte auch das Problem mit Separator fehlt und ich fand heraus , dass das Problem nur auftrat , wenn heightForRowAtIndexPathwurde eine Dezimalzahl Rückkehr . Lösung:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return ceil(yourHeight) // Ceiling this value fixes disappearing separators
}
Emelie
quelle
1
Was ist mit dem Fall, wenn ich nicht einmal die heightForRowAtIndexPath-Methode implementiere?
BS
Interessant. Dies passiert jedoch auch in meinem Projekt - und heightForRowAtIndexPath ist nicht implementiert. In IB ist die Zeilen- /
Johan
6
Es hat das Problem für mich nicht gelöst und ich habe die heightForRowAtIndexPath-Methode.
Gergely Kovacs
Behebt das Problem zumindest teilweise. Die Zelle scheint verwirrt über nicht ganzzahlige Höhen zu sein.
Nick Frolov
Sie müssen die Anzahl der Pixel begrenzen und dann durch den Skalierungsfaktor des Bildschirms dividieren, um Punkte zu erhalten, die in Ordnung sind, um dezimal zu sein. Wenn Sie dies nicht tun, wird es nicht für die Netzhaut optimiert.
trss
11

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.

airpaulg
quelle
das hört sich gut an, aber wie genau machst du das? viewforfooter verwenden?
Skinsfan00atg
1
ist nicht so einfach wie es sich anhört, aus irgendeinem Grund musste ich auch heightforfooter implementieren, sonst wurde die im initwithframe angegebene Höhe ignoriert. Ich bemerke aber auch, dass die hellgraue Farbe nicht die gleiche Farbe hat, so dass dies nicht wirklich funktioniert. Möglicherweise muss ein benutzerdefiniertes Grau erstellt werden
skinsfan00atg
das ist ziemlich ruckelig IMO
JackyJohnson
Ja, ich stimme voll und ganz zu. Es ist die einzige Problemumgehung, die ich direkt nach der Veröffentlichung von iOS 7 gefunden habe. Gibt es jetzt einen besseren Ansatz?
Airpaulg
2
Um die Farbe anzupassen, verwenden Sie tableView.separatorColor
Jeff
8

@samvermette

Ich habe das Problem mithilfe dieser Delegatenmethoden behoben. Jetzt flackert es nicht:

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}


-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}

quelle
7

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];die didSelectRowAtIndexPathDelegate-Methode für die Tabellenansicht eingefügt haben.

wrightak
quelle
Hast du es versucht self.tableView.allowsMultipleSelection = NO;?
Wrightak
6

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:

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
redmoon7777
quelle
1
Diese Problemumgehung hat es für mich behoben. Ich habe es jedoch umgekehrt - um die Auswahl beizubehalten. Deaktivieren Sie also zuerst die Auswahl und wählen Sie sie erneut aus.
Johan
2
Ich weiß nicht, was ich überschreiben soll, wenn Sie sagen "nachdem die Daten neu geladen wurden"
airpaulg
6

Ich habe festgestellt, dass die einfachste Lösung darin besteht, nach dem erneuten Laden einer Zelle auch die oben genannte Zelle neu zu laden:

if (indexPath.row > 0) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
}
conmulligan
quelle
1
Hat für mich gearbeitet. Vielen Dank. Alle anderen Methoden haben mir nicht geholfen (einschließlich der Änderung des Trennzeichens gegenüber der Antwort von Samvermette).
Surfrider
4

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:

for (UIView *subview in cell.contentView.superview.subviews) {
    if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
        subview.hidden = NO;
    }
}

Ich empfehle, dies einer Kategorie in UITableViewCell wie folgt hinzuzufügen:

@interface UITableViewCell (fixSeparator)
- (void)fixSeparator;
@end

@implementation UITableViewCell (fixSeparator)

- (void)fixSeparator {
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

@end

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:

@implementation UITableView (fixSeparators)

- (void)fixSeparators {
    for (UITableViewCell *cell in self.visibleCells) {
        [cell fixSeparator];
    }
}

@end

Mit dieser -fixSeparatosOption 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).

Lukas Petr
quelle
JA. Dies funktionierte für mich nach der Umstellung auf die neueste Version von Swift. ++ zum Aufrufen von fixSeparators nach jedem Aufruf von tableView.endUpdates ().
ObjectiveTC
1
Ich bin froh, dass dies für Sie hilfreich war! Ich glaube wirklich, dass dies die beste Lösung ist, also werden hoffentlich mehr Leute sie entdecken.
Lukas Petr
4

Basierend auf dem Kommentar von @ ortwin-gentz funktioniert diese Lösung für mich in iOS 9.

func fixCellsSeparator() {

    // Loop through every cell in the tableview
    for cell: UITableViewCell in self.tableView.visibleCells {

        // Loop through every subview in the cell which its class is kind of SeparatorView
        for subview: UIView in (cell.contentView.superview?.subviews)!
            where NSStringFromClass(subview.classForCoder).hasSuffix("SeparatorView") {
                subview.hidden = false
        }
    }

}

(SWIFT-Code)

Ich benutze die Funktion fixCellsSeparator () nach dem Aufruf endUpdates () in einigen Methoden meiner tableView, zum Beispiel:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //  Perform some stuff
    //  ...

    self.tableView.endUpdates()
    self.fixCellsSeparator()

}

Ich hoffe, diese Lösung ist für jemanden hilfreich!

Carlos D. Álvaro
quelle
2

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.

#define IS_OS_VERSION_7 (NSFoundationVersionNumber_iOS_6_1 < floor(NSFoundationVersionNumber))

#define UIColorFromRGB(hexRGBValue) [UIColor colorWithRed:((float)((hexRGBValue & 0xFF0000) >> 16))/255.0 green:((float)((hexRGBValue & 0xFF00) >> 8))/255.0 blue:((float)(hexRGBValue & 0xFF))/255.0 alpha:1.0]

// Dadurch wird das leere Tabellenraster unter den Zellen ausgeblendet, wenn sie nicht den gesamten Bildschirm abdecken

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    UIView *view = nil;

    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        CGFloat height = 1 / [UIScreen mainScreen].scale;
        view = [[UIView alloc] initWithFrame:CGRectMake(0., 0., 320., height)];
        view.backgroundColor = UIColorFromRGB(0xC8C7CC);
        view.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    }
    else
    {
        view = [UIView new];
    }
    return view;
}


- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        return 1 / [UIScreen mainScreen].scale;
    }
    else
    {
        // This will hide the empty table grid below the cells if they do not cover the entire screen
        return 0.01f;
    }
}
ivohad
quelle
2

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 ist contentView. Auch eingestelltcell.contentView.backgroundColor = [UIColor clearColor];

JimmyB
quelle
Das Setzen von clipSubviews auf false im Storyboard sowohl für die Zelle als auch für die Inhaltsansicht hat das Problem behoben! Benötigt mehr Stimmen!
Brett
Es hat mir gereicht, clipsToBounds für die Zellen auf YES zu setzen.
Rene Juuse
2

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 selectionStyleauf keine stellte. dh:

//This line brought up the issue for me
cell.selectionStyle = UITableViewCellSelectionStyleNone;

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:

tableView.allowsSelection = NO;

Hoffe, das hilft jemandem, wenn Sie keine Zellauswahl benötigen.

Arjun Mehta
quelle
2

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:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    var lineView = UIView(frame: CGRectMake(20, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width - 20, 1))

    lineView.backgroundColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1)
    cell.contentView.addSubview(lineView)
}

P / S: Benutzerdefiniert bei willDisplayCell NICHT cellForRowAtIndexPath

Lee
quelle
1

Es ist ziemlich überraschend, dass das separatorInsetHin- und Herwechseln des Zellenwerts funktioniert:

NSIndexPath *selectedPath = [self.controller.tableView indexPathForSelectedRow];
[self.controller.tableView deselectRowAtIndexPath:selectedPath animated:YES];

UITableViewCell *cell = [self.controller.tableView cellForRowAtIndexPath:selectedPath];
UIEdgeInsets insets = cell.separatorInset;
cell.separatorInset = UIEdgeInsetsMake(0.0, insets.left + 1.0, 0.0, 0.0);
cell.separatorInset = insets;
Bartosz Ciechanowski
quelle
1

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

- (UIView*) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    float w = tableView.frame.size.width;

    UIView * footerView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, w, 1)];
    footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    footerView.clipsToBounds=NO;

    UIView* separatoraddon = [[UIView alloc] initWithFrame:CGRectMake(0, -.5, w, .5)];
    separatoraddon.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    separatoraddon.backgroundColor = tableView.separatorColor;
    [footerView addSubview:separatoraddon];

    return footerView;
}
- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 1;
}
Paco_777
quelle
1

Ich habe beschlossen, diese Codezeilen dort einzufügen, wo die Aktualisierung der Tabellenansicht stattfindet:

self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;

Zum Beispiel habe ich sie in meinem Fall hier geputtet:

tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(insertIndexPaths, withRowAnimation: UITableViewRowAnimation.Fade)
tableView.endUpdates()
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;
Andorath
quelle
1

Sie müssen eine Zellenauswahl entfernen, bevor Sie die Zellen aktualisieren. Dann könnten Sie die Auswahl wiederherstellen.

NSIndexPath *selectedPath = [self.tableview indexPathForSelectedRow];
    [self.tableview deselectRowAtIndexPath:selectedPath animated:NO];
    [self.tableview reloadRowsAtIndexPaths:@[ path ] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableview selectRowAtIndexPath:selectedPath animated:NO scrollPosition:UITableViewScrollPositionNone];
Voloda2
quelle
1

Fügen Sie in viewDidLoad eine leere Fußzeile hinzu, um das oben genannte Problem zu beheben.

UIView *emptyView_ = [[UIView alloc] initWithFrame:CGRectZero];   
emptyView_.backgroundColor = [UIColor clearColor];  
[tableView setTableFooterView:emptyView_];

Verwenden Sie die obigen Zeilen nicht in der delegate-Methode viewForFooterInSection. Mittel Implementieren Sie die viewForFooterInSection-Methode nicht.

Suresh Durishetti
quelle
0

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

skinsfan00atg
quelle
0

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.

xT_Tx
quelle
0

Was für mich den Unterschied ausmachte, war das Neuladen der Zeile, für die die untere Trennlinie nicht angezeigt werden würde:

NSIndexPath *indexPath = 
     [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];  
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
Don Miguel
quelle
0

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:

UIView *tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
CALayer *topSeperatorLine = [CALayer layer];
topSeperatorLine.borderWidth = 0.5f;
topSeperatorLine.borderColor = [UIColor lightGrayColor].CGColor;
topSeperatorLine.frame = CGRectMake(0, 0, 320, 0.5f);
[tableFooterView.layer addSublayer:topSeperatorLine];
self.tableView.tableFooterView = tableFooterView;
jianpx
quelle
0

Implementieren Sie in Ihrer UITableViewCell-Unterklasse layoutSubviews und fügen Sie Folgendes hinzu:

- (void)layoutSubviews{
    [super layoutSubviews]
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            CGRect separatorFrame = subview.frame;
            separatorFrame.size.width = self.frame.size.width;
            subview.frame = separatorFrame;
        }
    }
}
Giorgos Ath
quelle
0

Wie bereits erwähnt, scheint sich dieses Problem auf verschiedene Weise zu manifestieren. Ich habe mein Problem mithilfe der folgenden Problemumgehung behoben:

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];
Chinabuffet
quelle
0

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ört

2) Die zweite Lösung hat bei mir funktioniert, aber der Code sieht etwas fragil aus, da er auf der internen Implementierung von basiertUITableViewCell

3) Das Hinzufügen eines eigenen Trennzeichens scheint derzeit am flexibelsten und besten zu sein, erfordert jedoch mehr Codierung :)

Julian Król
quelle
0

Das Einstellen des Stils viewWillAppearhat bei mir funktioniert.

villy393
quelle
0

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.

    var separator:UIView!
    if let s = cell.viewWithTag(1000)
    {
        separator = s
    }
    else
    {
        separator = UIView()
        separator.tag = 1000
        separator.setTranslatesAutoresizingMaskIntoConstraints(false)
        cell.addSubview(separator)

        // Swiper constraints
        var leadingConstraint = NSLayoutConstraint(item: separator, attribute: .Leading, relatedBy: .Equal, toItem: cell, attribute: .Leading, multiplier: 1, constant: 15)
        var heightConstraint = NSLayoutConstraint(item: separator, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0.5)
        var bottomConstraint = NSLayoutConstraint(item: cell, attribute: .Bottom, relatedBy: .Equal, toItem: separator, attribute: .Bottom, multiplier: 1, constant:0)
        var trailingConstraint = NSLayoutConstraint(item: cell, attribute: .Trailing, relatedBy: .Equal, toItem: separator, attribute: .Trailing, multiplier: 1, constant: 15)
        cell.addConstraints([bottomConstraint, leadingConstraint, heightConstraint, trailingConstraint])
    }

    if indexPath.row == 3
    {
        separator.backgroundColor = UIColor.clearColor()
    }
    else
    {
        separator.backgroundColor = UIColor.blackColor()
    }
Bjørn Ruthberg
quelle
0

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.

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    //  Fix for issue where seperators disappear

    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}];

[self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade];

[CATransaction commit];
mattsven
quelle
0

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 *)scrollViewMethode neu zu laden. Hier ein Beispiel:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
      if (scrollView == self.tableView1) {
          [self.tableView1 reloadData];
      }

      else {
          [self.tableView2 reloadData];
      }
}

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 UITableViewDelegateProtokoll fällt !

Ich hoffe es hilft!

smahmood11
quelle