UITableViewCell Ayırıcı iOS7'de kayboluyor


129

UITableViewYalnızca iOS 7'de bazı garip sorunum var .

UITableViewCellSeparatorilk satırın üstünde ve son satırın altında kaybolur. Bazen satırları veya bazı kaydırma eylemlerini seçtikten sonra görünür.

Benim durumumda stil ile tableViewyüklenir . Sorun, temerrütten değiştirilmeyen kesinlikle içinde değildir .StoryboardUITableViewStylePlainUITableViewCellSeparatorStyleUITableViewCellSeparatorStyleSingleLine

Apple Dev Forumlarında ( burada ve burada ) okuduğum gibi, başka insanların da böyle bir sorunu var ve bazı geçici çözümler bulundu, örneğin:

Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.

Ama yine de böyle bir ayırıcı tuhaf davranışın nedenini arıyorum.

Herhangi bir fikir?

Güncelleme: XCode 5.1 DP ve iOS 7.1 beta'da gördüğüm gibi, Apple bu sorunu çözmeye çalıştı. Şimdi ayırıcı, gerektiğinde son satırın altında, biraz yenilemeden sonra gösterilir, ancak tablo görünümü oluşturulduktan sonra gösterilmez.


19
Bazen iOS7'nin çok olgunlaşmamış olduğunu hissediyorum. Bu ve burada sahip olduğum şeylerin uzun listesi, iOS7'nin önceki iOS'ların mükemmelliğinden ne kadar uzak olduğunu gösteriyor.
Bms270

1
Apple'ın Ayarlar uygulamasında da aynı sorun var, bu yüzden bunun bir iOS 7 sorunu olduğuna inanıyorum. Bildirdim ve takibinde sorunu gösteren resimler istediler.
Johan

@Gatada Sorunu Ayarlar uygulamasının neresinde görüyorsunuz?
Jamie Forrest

2
Aynı sorunla karşılaşıldı ve [hücre setSeparatorInset: UIEdgeInsetsFromString (@ "1")] eklenerek düzeltildi; with (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath yöntemi
Ayesha Fatima

1
Bu hala iOS 8.0 betalarında bozuk görünüyor. Biri onu kopyalamak isterse 17724043 radarını açtım.
Andy Wilkinson

Yanıtlar:


77

Etkilenen hücrelerin alt görünüm hiyerarşisini terk ettim ve _UITableViewCellSeparatorViewgizli olarak ayarlandığını buldum . Gösterilmemesine şaşmamalı!

Ben overrode layoutSubviewsbenim de UITableViewCellalt sınıf ve şimdi ayırıcıları gösterilir:

Amaç-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
        }
    }
}

Burada önerilen diğer çözümler benim için tutarlı bir şekilde çalışmadı veya hantal görünmedi (özel 1 piksel altbilgi görünümleri ekleyerek).


Metodunuzu kullandım ama alt sınıfta değil UITableViewCell'e bir kategori ekledim. Bana yardımcı oldu. Teşekkürler.
Vitalii Boiarskyi

Elbette bir kategoride de mümkün. Bu yöntem değiştirme gerektirdiğinden, basit alt sınıf yaklaşımına gittim.
Ortwin Gentz

3
Benim için işe yarayan tek çözüm bu. Sorunum, UITableView’un kaydırılabilir olması için yeterli satıra sahip olmasıyla ortaya çıktı. Bu "hasSuffix:" kısmı oldukça kırılgan.
juhan_h

Benim için çalışıyor. Belki soru aptalca, ancak bu Özel API kullanımı değil mi?
Foriger

1
İOS9'da benim için çalışıyor
tounaobun

42

Bu benim için çalıştı:

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

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

Daha fazla oyu hak ediyorsunuz, tam da ihtiyacım olan şey buydu, onu bir kategoriye ekledim, bu yüzden şimdi [tableView reloadData] yaptıktan sonra, bu hata meydana gelirse (benim durumumda gizli olan altbilgi ayırıcısı yeniden görünüyorsa), [tableView reloadSeparators];
NiñoScript

12

Ben de ayırıcı eksik sorun vardı ve ben ne zaman sorun yalnızca oluştu öğrendim heightForRowAtIndexPathedildi ondalık sayı dönen . Çözüm:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return ceil(yourHeight) // Ceiling this value fixes disappearing separators
}

1
YükseklikForRowAtIndexPath yöntemini bile uygulamazsam durum ne olacak?
BS

İlginç. Ancak, benim projemde de oluyor - ve heightForRowAtIndexPath uygulanmadı. IB satır / hücre yüksekliği 100'dür.
Johan

6
Benim için sorunu çözmedi ve heightForRowAtIndexPath yöntemine sahibim.
Gergely Kovacs

Sorunu en azından kısmen çözer. Hücre, tamsayı olmayan yükseklikler konusunda kafası karışık görünüyor.
Nick Frolov

Ondalık sayı olması uygun olan noktaları elde etmek için piksel sayısını kaldırmanız ve ardından ekran ölçek faktörüne bölmeniz gerekir. Bunu yapmazsanız, retina optimize edilmeyecektir.
trss

11

Üstbilgiye 1 yükseklik UIV görünümü ve açık gri arka plan rengiyle tablonun altbilgisi eklemeyi denediniz mi? Temelde ilk ve son ayırıcılarla alay edecek.


bu kulağa hoş geliyor, ama bunu tam olarak nasıl yapıyorsunuz? önyükleyici için görüntü kullanılsın mı?
skinsfan00atg

1
göründüğü kadar kolay değil, bazı nedenlerden dolayı heightforfooter'ı da uygulamak zorunda kaldım, aksi takdirde initwithframe'de belirtilen yükseklik göz ardı edildi. Açık gri rengin aynı renk olmadığına da dikkat ediyorum, bu yüzden bu gerçekten işe yaramayacak. özel bir gri yapmak gerekebilir
skinsfan00atg

bu oldukça kötü IMO
JackyJohnson

Evet tamamen katılıyorum. İOS 7'nin piyasaya sürülmesinden hemen sonra bulduğum tek çözüm bu, şimdi daha iyi bir yaklaşım var mı?
airpaulg

2
Rengi eşleştirmek için tableView.separatorColor
Jeff

8

@samvermette

Bu temsilci yöntemlerini kullanarak sorunu çözdüm. Şimdi titremiyor:

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

7

Uygulamamızda bu sorunla karşılaştık. Kullanıcı bir hücre seçtiğinde, gezinme denetleyicisi yığınına yeni bir tablo görünümü aktarıldı ve ardından kullanıcı onu çıkardığında ayırıcı eksikti. Biz koyarak çözmüş [self.tableView deselectRowAtIndexPath:indexPath animated:NO];içinde didSelectRowAtIndexPathtablo görünümü temsilci yöntemiyle.


Denedin self.tableView.allowsMultipleSelection = NO;mi
wrightak

6

İhtiyacınız olursa daha kolay (biraz dağınık olmasına rağmen) bir geçici çözüm burada, veriler yeniden yüklendikten ve varsayılan animasyon tamamlandıktan sonra hücreyi seçmeyi ve seçimini kaldırmayı deneyin.

sadece ekle:

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];

1
Bu geçici çözüm benim için sorunu çözdü; ancak, seçimi korumak için bunu tersine çevirdim. Bu nedenle, önce seçimi kaldırın, ardından yeniden seçin.
Johan

2
"Veriler yeniden yüklendikten sonra" dediğinizde neyi geçersiz kılacağımı bilmiyorum
airpaulg

6

En kolay çözümün bir hücreyi yeniden yükledikten sonra yukarıdaki hücreyi de yeniden yüklemek olduğunu buldum:

if (indexPath.row > 0) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
}

1
Benim için çalıştı. Teşekkürler. Diğer yöntemler bana yardımcı olmadı (samvermette'nin cevabından ayırıcı stil değişikliği dahil).
sörfçü

4

Hem iOS 8 hem de iOS 9 (beta 1) üzerinde çalışan basit ve temiz bir çözüm

İşte basit, temiz ve müdahaleci olmayan bir çözüm. Ayırıcıları düzeltecek bir kategori yöntemini çağırmayı içerir.

Tek yapmanız gereken, hücrenin hiyerarşisinde gezinmek ve ayırıcının gizlemesini kaldırmaktır. Bunun gibi:

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

Bunu UITableViewCell'deki bir kategoriye şu şekilde eklemenizi tavsiye ederim:

@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

Ayırıcı, şu anda seçili olandan farklı bir hücrede kaybolabileceğinden, bu düzeltmeyi tablo görünümündeki tüm hücrelerde çağırmak muhtemelen iyi bir fikirdir . Bunun için UITableView'a aşağıdaki gibi bir kategori ekleyebilirsiniz:

@implementation UITableView (fixSeparators)

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

@end

Bu yerindeyken, -fixSeparatoskaybolmalarına neden olan eylemden hemen sonra tableView'unuzu çağırabilirsiniz . Benim durumumda, aradıktan sonra [tableView beginUpdates]ve [tableView endUpdates].

Başta da belirttiğim gibi bunu hem iOS 8 hem de iOS 9'da test ettim. İOS 7'de bile çalışacağını tahmin ediyorum ama orada denemenin bir yolu yok. Muhtemelen farkında olduğunuz gibi, bu hücrenin iç kısımlarıyla oynar, böylece gelecekteki bir sürümde çalışmayı durdurabilir. Ve Apple teorik olarak (% 0,001 şansla) bu nedenle uygulamanızı reddedebilir, ancak orada ne yaptığınızı nasıl öğrenebileceklerini bile anlayamıyorum (bir sınıfın son ekini kontrol etmek, statik çözümleyiciler tarafından bir şey olarak algılanamaz. kötü, IMO).


EVET. Swift'in en son sürümüne geçtikten sonra bu benim için çalıştı. ++ tableView.endUpdates () 'e yapılan her çağrıdan sonra fixSeparators çağırmak için.
ObjectiveTC

1
Bunun size yardımcı olmasına sevindim! Bunun en iyi çözüm olduğuna gerçekten inanıyorum, bu yüzden umarım daha fazla insan keşfedecektir.
Lukas Petr

4

@ Ortwin-gentz'in yorumuna göre, bu çözüm benim için iOS 9'da çalışıyor.

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 kodu)

Kullandığım fixCellsSeparator () çağrıldıktan sonra fonksiyonu ) (endUpdates örneğin benim tableView bazı yöntemlerde:

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

    //  Perform some stuff
    //  ...

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

}

Umarım bu çözüm birileri için yardımcı olur!


2

Airpaulg'un cevabını tamamlayın.

Yani temelde iki UITableDelegate yönteminin uygulanması gerekir. İşte hem iOS7 hem de iOS6'da çalışan çözümüm.

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

// Bu, tüm ekranı kaplamazlarsa hücrelerin altındaki boş tablo ızgarasını gizler

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

2

Bu benim için sorunu çözdü:

clipsToBoundsHücre için EVET, ancak hücreler için HAYIR olarak ayarlandığından emin olun contentView. Ayrıca ayarlacell.contentView.backgroundColor = [UIColor clearColor];


ClipSubviews'i hem hücre hem de contentView için film şeridinde false olarak ayarlamak sorunu çözdü! Daha fazla oy gerekiyor!
Brett

Hücrelerde clipToBounds'u YES olarak ayarlamak benim için yeterliydi.
Rene Juuse

2

Görünüşe göre bu sorun pek çok durumda kendini gösteriyor.

Benim için hücre seçimiyle bir ilgisi vardı. Neden olduğuna dair hiçbir fikrim yok ve çok derine inmek için zamanım olmadı, ancak hücrenin içini sıfır olarak ayarladığımda bunun meydana gelmeye başladığını söyleyebilirim selectionStyle. yani:

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

separatorStyle Mülkiyetini açıp kapatan yukarıdaki temsilci yöntemlerinden bazılarını kullanmayı denedim , tableViewancak sorunumu düzeltmek için hiçbir şey yapmadılar.

Buna ihtiyaç duymamın tek nedeni, hücre seçimine bile ihtiyacım olmamasıydı.

Bu yüzden benim için çalışan bir şey buldum. Seçimi az önce devre dışı bıraktım UITableView:

tableView.allowsSelection = NO;

Hücre seçimine ihtiyacınız yoksa, bunun birisine yardımcı olacağını umuyoruz.


2

Düzeltmek için çok fazla öneri denedim ama düzeltemedim.Son olarak aşağıdaki gibi özel ayırma çizgisine karar verdim:

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: willDisplayCell'de özel DEĞİL cellForRowAtIndexPath


1

Oldukça şaşırtıcı bir şekilde, hücrenin separatorInsetdeğerini ileri geri değiştirmek işe yarıyor gibi görünüyor:

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;

1

Ayrıca UITableView'umun altındaki bu tutarsız ayırıcı çizgi görüntüsü sorunu yaşadım. Özel bir altbilgi görünümü kullanarak, benzer bir çizgi oluşturabildim ve bunu potansiyel mevcut olanın (bazen eksik olan) üzerinde görüntüleyebildim.

Bu çözümün tek sorunu, Apple'ın bir gün hat kalınlığını değiştirebilmesidir.

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

1

Tablo görünümünün güncellenmesinin meydana geldiği bu kod satırlarını koymayı çözdüm:

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

Örneğin, benim durumumda onları buraya koydum:

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

1

Hücre güncellemesini yapmadan önce hücre seçimini kaldırmanız gerekir. Ardından seçimi geri yükleyebilirsiniz.

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

1

Yukarıdaki sorunu düzeltmek için viewDidLoad'a boş altbilgi ekleyin.

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

Lütfen yukarıdaki satırları viewForFooterInSection temsilci yönteminde kullanmayın. ViewForFooterInSection yöntemini uygulamayın anlamına gelir.


0

airpaulg yanıtını genişletmek için, çünkü tamamen benim için çalışmadı ..

yüksekliği elde etmek için heightforfooter yöntemini de uygulamak zorunda kaldım

sonra açık gri rengin çok koyu olduğunu fark ettim. Bunu, tablo görünümünün geçerli ayırıcı rengini alarak ve bunu kullanarak düzelttim:

UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];


0

Ben de projemizde bu sorunla karşılaştım. Tablo görünümümde bunun gerçekleşmesini sağlayan bir tableFooterView vardı. Bu tableFooterView öğesini kaldırırsam son satırın altındaki ayırıcının görüneceğini buldum.


0

Benim için fark yaratan şey, alt ayırma çizgisinin görünmeyeceği satırı yeniden yüklemekti:

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

0

Bu sorunu başka bir şekilde çözüyorum: alt katmanı olarak tableview.tableFooterView'a yüksekliği 0.5px ve rengi açık gri olan bir katman ekleyin.

kod aynen şöyle:

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;

0

UITableViewCell Alt Sınıfınızda layoutSubviews'i uygulayın ve şunu ekleyin:

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

0

Başka birinin de bahsettiği gibi, bu sorun çeşitli şekillerde ortaya çıkıyor gibi görünüyor. Sorunumu aşağıdaki geçici çözümle çözdüm:

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

0

Cevapları ve çözümleri gözden geçirirken, bu tür gözlemlerle geldiğim:

Bu, hem iOS 7 hem de 8'de sorunlu gibi görünüyor. viewDidLoadYöntemdeki koddan hücre seçerken sorunu fark ettim, bu yüzden:

1) viewDidAppear:Birisinin görünümü sunmakla hücreyi seçmek arasındaki fark edilebilir gecikmeyi önemsememesi durumunda geçici çözüm bunu yapıyordu

2) ikinci çözüm benim için işe yaradı, ancak kodun dahili uygulamasına dayandığı için kod biraz kırılgan görünüyorUITableViewCell

3) Kendi ayırıcı eklemek şimdilik en esnek ve en iyisi gibi görünüyor, ancak daha fazla kodlama gerektiriyor :)



0

Bu hala IOS 8 ile ilgili bir sorun olduğu için çözümümü Swift'e ekleyeceğim. Tablo görünümü ayırıcı satırını yok olarak ayarlayın. Daha sonra bu kodu cellForRowAtIndexPath temsilci yöntemine ekleyin. Güzel bir ayırıcı katacak. İf ifadesi, hangi hücrelerin ayırıcıya sahip olması gerektiğine karar vermeyi sağlar.

    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()
    }

0

İşte bu soruna çözümüm. Hücrelerinizi ekledikten sonra bölümü yeniden yükleyin. Tüm bölümü yeniden yüklemek sizin için çok yoğunsa, indexPaths'i yukarıdan ve aşağıdan yeniden yükleyin.

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

0

benzer bir sorunla karşılaştım, başka bir iyi çözüm buldum, özellikle dataSource'unuz büyük değilse, -(void)scrollViewDidScroll:(UIScrollView *)scrollViewyöntemi uyguladığınızda tableData'yı yeniden yüklüyorsunuz , işte bir örnek:

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

      else {
          [self.tableView2 reloadData];
      }
}

Ayrıca, görünür veri kaynağına dayalı olarak görünmeyen verileri de yeniden yükleyebilirsiniz, ancak bu biraz daha hackleme gerektirir.

Bu delege işlevinin, UITableViewDelegate protokole tabi olduğunu unutmayın!

Umarım yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.