Pemisah UITableViewCell menghilang di iOS7

129

Saya memiliki beberapa masalah aneh dengan UITableViewhanya di iOS 7.

UITableViewCellSeparatormenghilang di atas baris pertama dan di bawah baris terakhir. Kadang-kadang setelah memilih baris atau beberapa tindakan bergulir muncul.

Dalam kasus saya tableViewdiambil dari Storyboarddengan UITableViewStylePlaingaya. Masalahnya pasti tidak ada UITableViewCellSeparatorStyle, yang tidak diubah dari standar UITableViewCellSeparatorStyleSingleLine.

Ketika saya membaca di Forum Dev Apple (di sini dan di sini ) orang lain memiliki masalah seperti itu dan beberapa solusi ditemukan, misalnya:

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

Tapi saya masih mencari alasan perilaku aneh pemisah seperti itu.

Ada ide?

Pembaruan: Seperti yang saya lihat di XCode 5.1 DP dan iOS 7.1 beta, Apple mencoba untuk memperbaiki masalah ini. Sekarang separator ditampilkan sesuai kebutuhan kadang-kadang di bawah baris terakhir, setelah beberapa refresh, tetapi tidak setelah pembuatan tampilan tabel.

BS
sumber
19
Terkadang saya merasa iOS7 begitu tidak dewasa. Ini dan daftar panjang hal-hal yang saya miliki di sini menunjukkan seberapa jauh iOS7 dari kesempurnaan iOS sebelumnya.
Bms270
1
Aplikasi Pengaturan oleh Apple memiliki masalah yang sama, jadi saya percaya ini adalah masalah iOS 7. Saya telah melaporkannya, dan dalam tindak lanjut mereka, mereka meminta gambar yang menunjukkan masalah tersebut.
Johan
@Gatada Di mana di aplikasi Pengaturan Anda melihat masalah ini?
Jamie Forrest
2
Mengalami masalah yang sama dan diperbaiki dengan menambahkan [setSeparatorInset sel: UIEdgeInsetsFromString (@ "1")]; dengan dalam (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) metode indexPath
Ayesha Fatima
1
Ini tampaknya masih rusak di betas iOS 8.0. Saya telah membuka radar 17724043 jika ada yang peduli untuk memperbaikinya.
Andy Wilkinson

Jawaban:

77

Saya membuang hierarki subview sel yang terpengaruh dan menemukan bahwa _UITableViewCellSeparatorViewitu diatur ke tersembunyi. Tidak heran itu tidak ditampilkan!

Saya mengesampingkan layoutSubviewsdalam UITableViewCellsubclass saya dan sekarang separator ditampilkan dengan andal:

Tujuan-C :

- (void)layoutSubviews {
    [super layoutSubviews];

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

Cepat :

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

Solusi lain yang diusulkan di sini tidak bekerja secara konsisten untuk saya atau tampak kikuk (menambahkan tampilan footer kustom 1 px).

Ortwin Gentz
sumber
Saya telah menggunakan metode Anda tetapi tidak di subkelas saya telah menambahkan kategori ke UITableViewCell. Itu membantu saya. Terima kasih.
Vitalii Boiarskyi
Tentu saja itu juga mungkin dalam suatu kategori. Karena ini membutuhkan metode swizzling, saya menggunakan pendekatan subclass sederhana.
Ortwin Gentz
3
Ini adalah satu-satunya solusi yang berhasil untuk saya. Masalah saya muncul ketika UITableView memiliki cukup baris untuk dapat digulir. Bagian "hasSuffix:" cukup rapuh.
juhan_h
Bekerja untukku. Mungkin pertanyaan itu konyol, tetapi bukankah ini menggunakan API Pribadi?
Foriger
1
Bekerja untuk saya di iOS9
tounaobun
42

Ini bekerja untuk saya:

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

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
samvermette
sumber
Anda berhak mendapatkan lebih banyak suara, ini adalah persis apa yang saya butuhkan, saya menambahkannya dalam kategori, jadi sekarang setelah saya melakukan [tableView reloadData], jika bug ini terjadi (dalam kasus saya pemisah footer yang disembunyikan muncul kembali), saya sebut [tableView reloadSeparators];
NiñoScript
12

Saya juga punya masalah dengan hilang pemisah dan saya menemukan bahwa masalah hanya terjadi ketika heightForRowAtIndexPathitu kembali angka desimal . Larutan:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return ceil(yourHeight) // Ceiling this value fixes disappearing separators
}
Emelie
sumber
1
Bagaimana dengan kasus ini jika saya tidak menerapkan metode heightForRowAtIndexPath bahkan?
BS
Menarik. Namun, itu terjadi di proyek saya juga - dan heightForRowAtIndexPath tidak diimplementasikan. Dalam baris IB / tinggi sel adalah 100.
Johan
6
Itu tidak memecahkan masalah bagi saya dan saya punya metode heightForRowAtIndexPath.
Gergely Kovacs
Memecahkan masalah setidaknya sebagian. Sel tampaknya bingung tentang ketinggian non-integer.
Nick Frolov
Anda perlu menghitung jumlah piksel dan kemudian membaginya dengan faktor skala layar untuk mendapatkan poin yang boleh dalam bentuk desimal. Jika Anda tidak melakukan ini, retina tidak akan dioptimalkan.
trss
11

Apakah Anda mencoba menambahkan UIView dengan tinggi 1 di header dan footer tabel dengan warna latar abu-abu terang? Pada dasarnya itu akan mengolok-olok pemisah pertama dan terakhir.

airpaulg
sumber
ini kedengarannya bagus, tetapi bagaimana tepatnya Anda melakukan ini? gunakan viewforfooter?
skinsfan00atg
1
tidak semudah kedengarannya, untuk beberapa alasan saya juga harus mengimplementasikan heightforfooter jika ketinggian yang ditentukan dalam initwithframe diabaikan. Saya juga memperhatikan bahwa warna lightgraycolor tidak sama sehingga ini tidak akan bekerja. mungkin harus membuat abu
skinsfan00atg
itu IMO yang sangat janky
JackyJohnson
Ya saya sepenuhnya setuju. Ini satu-satunya solusi yang saya temukan tepat setelah rilis iOS 7, apakah ada pendekatan yang lebih baik sekarang?
airpaulg
2
Untuk mencocokkan warna, gunakan tableView.separatorColor
Jeff
8

@samvermette

Saya memperbaiki masalah dengan menggunakan metode delegasi ini. Sekarang tidak berkedip:

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

sumber
7

Kami mengalami masalah ini di aplikasi kami. Ketika pengguna memilih sel, tampilan tabel baru didorong ke tumpukan pengontrol navigasi dan kemudian ketika pengguna muncul itu, pemisah tidak ada. Kami dipecahkan dengan meletakkan [self.tableView deselectRowAtIndexPath:indexPath animated:NO];di didSelectRowAtIndexPathmetode delegasi tampilan tabel.

wrightak
sumber
Sudahkah Anda mencoba self.tableView.allowsMultipleSelection = NO;?
wrightak
6

Ini solusi yang lebih mudah (walaupun sedikit berantakan) jika Anda membutuhkannya, coba pilih dan hapus pilihan sel setelah data dimuat ulang dan animasi default selesai.

tambahkan saja:

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];
redmoon7777
sumber
1
Solusi ini memperbaikinya untuk saya; Namun, saya membaliknya - untuk mempertahankan seleksi. Jadi, hapus dulu pilihannya, lalu pilih kembali.
Johan
2
Saya tidak tahu apa yang harus ditimpa ketika Anda mengatakan "setelah data dimuat ulang"
airpaulg
6

Saya telah menemukan bahwa solusi termudah adalah, setelah memuat ulang sel, juga memuat ulang sel di atas:

if (indexPath.row > 0) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
}
conmulligan
sumber
1
Bekerja untukku. Terima kasih. Metode lain tidak membantu saya (termasuk perubahan gaya pemisah dari jawaban samvermette).
peselancar
4

Solusi sederhana dan bersih yang bekerja di iOS 8 dan iOS 9 (beta 1)

Ini sederhana, bersih dan tidak mengganggu. Ini melibatkan pemanggilan metode kategori yang akan memperbaiki pemisah.

Yang perlu Anda lakukan adalah berjalan menyusuri hierarki sel dan un-hide pemisah. Seperti ini:

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

Apa yang saya sarankan adalah menambahkan ini ke kategori di UITableViewCell, seperti ini:

@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

Karena pemisah dapat menghilang dalam sel yang berbeda dari yang dipilih saat ini, mungkin ide yang baik untuk memanggil perbaikan ini pada semua sel dalam tampilan tabel. Untuk itu, Anda dapat menambahkan kategori ke UITableView yang berbunyi seperti ini:

@implementation UITableView (fixSeparators)

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

@end

Dengan ini, Anda bisa memanggil -fixSeparatostableView Anda tepat setelah tindakan yang menyebabkan mereka menghilang. Dalam kasus saya, itu setelah menelepon [tableView beginUpdates]dan [tableView endUpdates].

Seperti yang saya nyatakan di awal, saya sudah menguji ini di iOS 8 dan iOS 9. Saya kira itu akan bekerja bahkan di iOS 7 tapi saya tidak punya cara untuk mencobanya di sana. Seperti yang mungkin Anda sadari, ini mengotak-atik internal sel sehingga bisa berhenti bekerja di beberapa rilis mendatang. Dan Apple secara teoritis (kemungkinan 0,001%) menolak aplikasi Anda karena hal ini, tetapi saya tidak dapat melihat bagaimana mereka dapat mengetahui apa yang Anda lakukan di sana (memeriksa akhiran suatu kelas tidak dapat dideteksi oleh analis statis sebagai sesuatu buruk, IMO).

Lukas Petr
sumber
IYA. Ini berhasil bagi saya, setelah mengonversi ke versi terbaru Swift. ++ untuk memanggil fixSeparator setelah setiap panggilan ke tableView.endUpdates ().
ObjectiveTC
1
Saya senang ini membantu Anda! Saya benar-benar percaya ini adalah solusi terbaik, jadi semoga lebih banyak orang akan menemukannya.
Lukas Petr
4

Berdasarkan komentar @ ortwin-gentz, solusi ini cocok untuk saya di 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
        }
    }

}

(Tukar Kode)

Saya menggunakan fungsi fixCellsSeparator () setelah memanggil endUpdates () dalam beberapa metode tableView saya, misalnya:

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

    //  Perform some stuff
    //  ...

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

}

Saya harap solusi ini bermanfaat bagi seseorang!

Carlos D. Álvaro
sumber
2

Melengkapi jawaban airpaulg.

Jadi pada dasarnya kita harus mengimplementasikan dua metode UITableDelegate. Inilah solusi saya yang berfungsi pada iOS7 dan iOS6.

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

// Ini akan menyembunyikan grid tabel kosong di bawah sel jika mereka tidak menutupi seluruh layar

- (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
sumber
2

Ini memperbaiki masalah bagi saya:

Pastikan clipsToBoundsdiatur ke YA untuk sel, tetapi TIDAK untuk sel contentView. Juga diaturcell.contentView.backgroundColor = [UIColor clearColor];

JimmyB
sumber
Mengatur clipSubviews menjadi false di storyboard untuk kedua sel dan contentView memperbaiki masalah! Membutuhkan lebih banyak suara!
Brett
Mengatur clipsToBounds ke YA pada sel sudah cukup bagi saya.
Rene Juuse
2

Sepertinya masalah ini bermanifestasi dalam banyak keadaan.

Bagi saya itu ada hubungannya dengan pemilihan sel. Saya tidak tahu mengapa dan tidak punya waktu untuk menggali terlalu dalam, tetapi saya bisa mengatakan itu mulai terjadi ketika saya mengatur sel selectionStyletidak ada. yaitu:

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

Saya mencoba menggunakan beberapa metode delegasi di atas yang menghidupkan dan mematikan separatorStyle properti tableViewtetapi mereka tampaknya tidak melakukan apa pun untuk memperbaiki masalah saya.

Seluruh alasan mengapa saya membutuhkannya adalah karena saya bahkan tidak membutuhkan pemilihan sel.

Jadi, saya memang menemukan sesuatu yang bekerja untuk saya. Saya baru saja menonaktifkan pilihan pada UITableView:

tableView.allowsSelection = NO;

Semoga ini bisa membantu seseorang, jika Anda tidak perlu memilih sel.

Arjun Mehta
sumber
2

Saya mencoba banyak saran untuk memperbaikinya tetapi tidak dapat memperbaikinya. Akhirnya saya memutuskan untuk membuat garis pemisah seperti di bawah ini:

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: kustom di willDisplayCell BUKAN cellForRowAtIndexPath

lee
sumber
1

Cukup mengejutkan, mengubah separatorInsetnilai sel bolak-balik tampaknya berfungsi:

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
sumber
1

Saya juga memiliki masalah tampilan garis pemisah yang tidak konsisten ini di bagian bawah UITableView saya. Menggunakan tampilan footer kustom, saya telah dapat membuat garis yang sama dan menampilkannya di atas potensi yang ada (yang kadang-kadang hilang).

Satu-satunya masalah dari solusi ini adalah bahwa Apple dapat mengubah ketebalan garis suatu hari

- (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
sumber
1

Saya telah memutuskan untuk meletakkan baris kode ini di mana pembaruan tableview terjadi:

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

Misalnya, dalam kasus saya, saya memasukkannya ke sini:

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

Anda perlu menghapus pilihan sel sebelum Anda melakukan pembaruan sel. Maka Anda bisa mengembalikan pilihan.

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
sumber
1

Untuk memperbaiki masalah di atas, tambahkan footer kosong di viewDidLoad.

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

Tolong jangan gunakan baris di atas dalam metode delegasi viewForFooterInSection. Berarti Jangan menerapkan metode viewForFooterInSection.

Suresh Durishetti
sumber
0

untuk memperluas jawaban airpaulg, karena itu tidak sepenuhnya bekerja untuk saya ..

Saya juga harus menerapkan metode heightforfooter untuk mendapatkan ketinggian

kemudian saya perhatikan warna cahaya terlalu gelap. saya memperbaiki ini dengan meraih warna pemisah saat ini dari tampilan tabel dan menggunakannya:

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

skinsfan00atg
sumber
0

Saya juga mengalami masalah ini dalam proyek kami. Tampilan tabel saya memiliki tableFooterView yang dapat membuat ini terjadi. Saya menemukan pemisah di bawah baris terakhir akan muncul jika saya menghapus tableFooterView itu.

xT_Tx
sumber
0

Apa yang membuat perbedaan bagi saya adalah memuat ulang baris yang tidak akan muncul garis pemisah bawah:

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

Saya memecahkan masalah ini dengan cara lain: tambahkan layer yang tingginya 0,5px dan warnanya lightgray ke tableview.tableFooterView sebagai sublapisannya.

kodenya seperti ini:

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
sumber
0

Di Subclass UITableViewCell Anda, implementasikan layoutSubviews dan tambahkan:

- (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
sumber
0

Seperti orang lain sebutkan, masalah ini tampaknya terwujud dalam berbagai cara. Saya menyelesaikan masalah saya melalui solusi berikut:

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

Menjelajahi jawaban dan solusi saya datang dengan pengamatan seperti:

Ini tampaknya bermasalah di iOS 7 dan 8. Saya perhatikan masalah ketika memilih sel dari kode viewDidLoad metode jadi:

1) solusi melakukannya di viewDidAppear: jika seseorang tidak keberatan dengan keterlambatan yang terlihat antara menyajikan tampilan dan memilih sel

2) solusi kedua bekerja untuk saya tetapi kode terlihat agak rapuh karena didasarkan pada implementasi internalUITableViewCell

3) menambahkan pemisah sendiri tampaknya menjadi yang paling fleksibel dan terbaik untuk saat ini tetapi membutuhkan lebih banyak coding :)

Julian Król
sumber
0

Pengaturan gaya viewWillAppearbekerja untuk saya.

villy393
sumber
0

Karena ini masih merupakan masalah dengan iOS 8, saya akan menambahkan solusi saya di Swift. Setel garis pemisah tampilan tabel menjadi tidak ada. Kemudian tambahkan kode ini ke metode delegasi cellForRowAtIndexPath. Ini akan menambahkan pemisah yang bagus. Pernyataan if memungkinkan untuk memutuskan sel mana yang harus memiliki pemisah.

    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
sumber
0

Inilah solusi saya untuk masalah ini. Setelah Anda memasukkan sel Anda, muat ulang bagian itu. Jika memuat ulang seluruh bagian terlalu intensif untuk Anda, cukup muat ulang indexPaths di atas dan di bawah.

[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
sumber
0

mengalami masalah yang sama, saya menemukan bahwa solusi lain yang baik, terutama jika dataSource Anda tidak besar adalah memuat ulang tableData ketika Anda menerapkan -(void)scrollViewDidScroll:(UIScrollView *)scrollViewmetode ini, berikut ini sebuah contoh:

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

      else {
          [self.tableView2 reloadData];
      }
}

Anda juga dapat memuat ulang data yang tidak terlihat berdasarkan sumber data yang terlihat, tetapi itu membutuhkan beberapa peretasan lagi.

Ingatlah bahwa fungsi delegasi ini termasuk dalam UITableViewDelegateprotokol!

Semoga ini bisa membantu!

smahmood11
sumber