Dấu tách UITableViewCell biến mất trong iOS7


129

Tôi có một số vấn đề lạ UITableViewchỉ có trong iOS 7.

UITableViewCellSeparatorbiến mất trên hàng đầu tiên và bên dưới hàng cuối cùng. Đôi khi sau khi chọn các hàng hoặc một số hành động cuộn, nó xuất hiện.

Trong trường hợp của tôi tableViewđược tải từ Storyboardvới UITableViewStylePlainphong cách. Vấn đề là chắc chắn không có UITableViewCellSeparatorStyle, mà không được thay đổi từ mặc định UITableViewCellSeparatorStyleSingleLine.

Như tôi đã đọc tại Diễn đàn Apple Dev ( ở đâyở đây ) những người khác có vấn đề như vậy và một số cách giải quyết được tìm thấy, ví dụ:

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

Nhưng tôi vẫn đang tìm kiếm lý do của hành vi kỳ lạ như vậy.

Có ý kiến ​​gì không?

Cập nhật: Như tôi thấy trong XCode 5.1 DP và iOS 7.1 beta, Apple đã cố gắng khắc phục sự cố này. Bây giờ dấu phân cách được hiển thị khi cần thiết đôi khi bên dưới hàng cuối cùng, sau một số làm mới, nhưng không phải sau khi tạo bảng xem.


19
Đôi khi tôi cảm thấy như iOS7 quá non nớt. Điều này và danh sách dài những thứ mà tôi có ở đây cho thấy iOS7 cách sự hoàn hảo của các iOS trước đó bao xa.
Bms270

1
Ứng dụng Cài đặt của Apple có cùng một vấn đề, vì vậy tôi tin rằng đây là sự cố iOS 7. Tôi đã báo cáo nó, và trong quá trình theo dõi của họ, họ đã yêu cầu những hình ảnh cho thấy vấn đề này.
Johan

@Gatada Bạn đang gặp vấn đề ở đâu trong ứng dụng Cài đặt?
Jamie Forrest

2
Đã gặp phải vấn đề tương tự và được khắc phục bằng cách thêm [cell setSpayatorInset: UIEdgeInsetsFromString (@ "1")]; với bảng (UITableViewCell *) Xem: (UITableView *) bảngView cellForRowAtIndexPath: (NSIndexPath *) indexPath
Ayesha Fatima

1
Điều này dường như vẫn bị phá vỡ trong betas iOS 8.0. Tôi đã mở radar 17724043 nếu có ai quan tâm để sao chép nó.
Andy Wilkinson

Câu trả lời:


77

Tôi đã bỏ cấu trúc phân cấp của các ô bị ảnh hưởng và thấy rằng nó _UITableViewCellSeparatorViewđược đặt thành ẩn. Không có gì ngạc nhiên khi nó không được hiển thị!

Tôi overrode layoutSubviewstrong UITableViewCelllớp con của tôi và bây giờ các dấu phân cách được hiển thị đáng tin cậy:

Mục tiêu-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
        }
    }
}

Các giải pháp khác được đề xuất ở đây không phù hợp với tôi hoặc có vẻ khó hiểu (thêm chế độ xem chân trang 1 px tùy chỉnh).


Tôi đã sử dụng phương thức của bạn nhưng không phải trong lớp con, tôi đã thêm một thể loại vào UITableViewCell. Nó đã giúp đỡ tôi. Cảm ơn.
Vitalii Boiarskyi

Tất nhiên nó cũng có thể trong một thể loại. Vì điều này đòi hỏi phương pháp swizzling, tôi đã đi đến cách tiếp cận lớp con đơn giản.
Ortwin Gentz

3
Đây là giải pháp duy nhất làm việc cho tôi. Vấn đề của tôi xuất hiện khi UITableView có đủ hàng để có thể cuộn. Đó là phần "hasSuffix:" khá dễ vỡ.
juhan_h

Làm việc cho tôi. Có thể câu hỏi là ngớ ngẩn, nhưng đây không phải là sử dụng API riêng?
Foriger

1
Hoạt động với tôi trong iOS9
tounaobun

42

Điều này làm việc cho tôi:

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

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

Bạn xứng đáng được nhiều phiếu hơn, đây chính xác là những gì tôi cần, tôi đã thêm nó vào một danh mục, vì vậy bây giờ sau khi tôi thực hiện [tableView reloadData], nếu lỗi này xảy ra (trong trường hợp của tôi, dấu phân cách chân trang bị ẩn xuất hiện trở lại), tôi gọi [bảng Xem lại phần mềm nạp tiền];
NiñoScript

12

Tôi cũng đã có vấn đề với thiếu tách và tôi phát hiện ra rằng vấn đề chỉ xảy ra khi heightForRowAtIndexPathđược trả lại một số thập phân . Giải pháp:

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

1
Còn trường hợp nếu tôi không thực hiện ngay cả phương thức heightForRowAtIndexPath thì sao?
BS

Hấp dẫn. Tuy nhiên, điều đó cũng xảy ra trong dự án của tôi - và heightForRowAtIndexPath không được triển khai. Trong hàng IB / chiều cao ô là 100.
Johan

6
Nó không giải quyết được vấn đề cho tôi và tôi có phương thức heightForRowAtIndexPath.
Gergely Kovacs

Giải quyết vấn đề ít nhất một phần. Các tế bào dường như bị nhầm lẫn về chiều cao không nguyên.
Nick Frolov

Bạn cần trần số lượng pixel và sau đó chia cho hệ số tỷ lệ màn hình để có được số điểm ổn định ở dạng thập phân. Nếu bạn không làm điều này, nó sẽ không được tối ưu hóa võng mạc.
trss

11

Bạn đã thử thêm một UIView có chiều cao 1 trong tiêu đề và chân trang của bảng với màu nền xám nhạt chưa? Về cơ bản, nó sẽ chế nhạo các dải phân cách đầu tiên và cuối cùng.


Điều này nghe có vẻ tốt, nhưng chính xác làm thế nào để bạn làm điều này? sử dụng viewforfooter?
skinfan00atg

1
không dễ dàng như người ta tưởng, vì một số lý do tôi cũng phải thực hiện heightforfooter nếu không thì chiều cao được chỉ định trong initwithframe đã bị bỏ qua. Tôi cũng nhận thấy rằng lightgraycolor không cùng màu nên điều này sẽ không thực sự hiệu quả. có thể phải tạo một màu xám tùy chỉnh
skinfan00atg

IMO khá
vui nhộn

Vâng, tôi hoàn toàn đồng ý. Đó là cách giải quyết duy nhất tôi tìm thấy ngay sau khi phát hành iOS 7, bây giờ có cách tiếp cận nào tốt hơn không?
sóng

2
Để phù hợp với màu sắc, hãy sử dụng bảngView.separatorColor
Jeff

8

@samvermette

Tôi đã khắc phục vấn đề bằng cách sử dụng phương pháp đại biểu này. Bây giờ nó không nhấp nháy:

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

Chúng tôi đã gặp vấn đề này trong ứng dụng của chúng tôi. Khi người dùng chọn một ô, chế độ xem bảng mới được đẩy lên ngăn điều khiển điều hướng và sau đó khi người dùng bật nó ra, dấu phân cách bị thiếu. Chúng tôi đã giải quyết nó bằng cách đưa [self.tableView deselectRowAtIndexPath:indexPath animated:NO];vào didSelectRowAtIndexPathphương thức đại biểu xem bảng.


Bạn đã thử self.tableView.allowsMultipleSelection = NO;chưa
wrightak

6

Đây là một cách giải quyết dễ dàng hơn (mặc dù hơi lộn xộn) nếu bạn cần, hãy thử chọn và bỏ chọn ô sau khi dữ liệu được tải lại và hoạt ảnh mặc định được thực hiện.

chỉ cần thêm:

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

1
Cách giải quyết này đã sửa nó cho tôi; tuy nhiên, tôi đã đảo ngược nó - để giữ lại lựa chọn. Vì vậy, đầu tiên bỏ chọn, sau đó chọn lại.
Johan

2
Tôi không biết ghi đè gì khi bạn nói "sau khi dữ liệu được tải lại"
airpaulg

6

Tôi đã thấy rằng giải pháp đơn giản nhất là, sau khi tải lại một ô, cũng tải lại ô ở trên:

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

1
Đã làm cho tôi. Cảm ơn. Bất kỳ phương pháp nào khác không giúp tôi (bao gồm thay đổi kiểu phân cách từ câu trả lời của samvermette).
surfrider

4

Một giải pháp đơn giản và gọn gàng, hoạt động trên cả iOS 8 và iOS 9 (beta 1)

Đây là một đơn giản, sạch sẽ cách giải quyết và không xâm phạm. Nó liên quan đến việc gọi một phương thức thể loại sẽ sửa chữa các dấu phân cách.

Tất cả những gì bạn cần làm là đi xuống cấu trúc phân cấp của ô và bỏ ẩn dấu phân cách. Như thế này:

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

Những gì tôi khuyên là nên thêm phần này vào một danh mục trên UITableViewCell, như thế này:

@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

Vì dấu phân cách có thể biến mất trong các ô khác với ô hiện được chọn, nên có thể gọi cách khắc phục này trên tất cả các ô trong chế độ xem bảng. Vì thế, bạn có thể thêm một danh mục vào UITableView như sau:

@implementation UITableView (fixSeparators)

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

@end

Với vị trí này, bạn có thể gọi -fixSeparatostrên bảng của mình ngay sau khi hành động khiến chúng biến mất. Trong trường hợp của tôi, đó là sau khi gọi[tableView beginUpdates][tableView endUpdates].

Như tôi đã nói lúc đầu, tôi đã thử nghiệm điều này trên cả iOS 8 và iOS 9. Tôi cho rằng nó sẽ hoạt động ngay cả trên iOS 7 nhưng tôi không có cách nào để thử nó ở đó. Như bạn có thể biết, điều này không phù hợp với các phần bên trong của tế bào để nó có thể ngừng hoạt động trong một số bản phát hành trong tương lai. Và về mặt lý thuyết, Apple có thể (0,001% cơ hội) từ chối ứng dụng của bạn vì điều này, nhưng tôi không thể thấy họ thậm chí có thể tìm ra những gì bạn đang làm ở đó (kiểm tra hậu tố của một lớp không thể được phát hiện bởi các máy phân tích tĩnh như một thứ gì đó xấu, IMO).


ĐÚNG. Điều này làm việc cho tôi, sau khi chuyển đổi sang phiên bản Swift mới nhất. ++ để gọi fixSeparators sau mỗi cuộc gọi đến tableView.endUpdates ().
ObjectiveTC

1
Tôi vui vì điều này hữu ích cho bạn! Tôi thực sự tin rằng đây là giải pháp tốt nhất, vì vậy hy vọng sẽ có nhiều người khám phá ra nó.
Lukas Petr

4

Dựa trên nhận xét của @ ortwin-gentz, giải pháp này hiệu quả với tôi trong 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
        }
    }

}

(Mã Swift)

Tôi sử dụng hàm fixCellsSeparator () sau khi gọi endUpdates () trong một số phương thức của bảngView của tôi, ví dụ:

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

    //  Perform some stuff
    //  ...

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

}

Tôi hy vọng giải pháp này sẽ hữu ích cho ai đó!


2

Bổ sung cho câu trả lời của airpaulg.

Vì vậy, về cơ bản người ta phải thực hiện hai phương pháp UITableDelegate. Đây là giải pháp của tôi hoạt động trên cả iOS7 và 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]

// Điều này sẽ ẩn lưới bảng trống bên dưới các ô nếu chúng không bao phủ toàn bộ màn hình

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

Điều này đã khắc phục sự cố cho tôi:

Đảm bảo clipsToBoundsđược đặt thành CÓ cho ô, nhưng KHÔNG cho ô contentView. Cũng đặtcell.contentView.backgroundColor = [UIColor clearColor];


Đặt clipSubview thành false trong bảng phân cảnh cho cả ô và nội dung Xem đã khắc phục sự cố! Cần nhiều phiếu hơn!
Brett

Đặt clipToBound thành CÓ trên các ô là đủ cho tôi.
Rene Juuse

2

Có vẻ như vấn đề này biểu hiện dưới rất nhiều hoàn cảnh.

Đối với tôi nó có một cái gì đó để làm với lựa chọn tế bào. Tôi không biết tại sao và không có thời gian để nghiên cứu về nó quá sâu, nhưng tôi có thể nói nó bắt đầu xảy ra khi tôi đặt tế bào selectionStylethành không. I E:

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

Tôi đã thử sử dụng một số phương thức ủy nhiệm ở trên để bật và tắt thuộc separatorStyle tính củatableView nhưng chúng dường như không làm gì để khắc phục vấn đề của tôi.

Toàn bộ lý do tại sao tôi cần điều đó là vì tôi thậm chí không cần chọn tế bào.

Vì vậy, tôi đã tìm thấy một cái gì đó làm việc cho tôi. Tôi chỉ vô hiệu hóa lựa chọn trên UITableView:

tableView.allowsSelection = NO;

Hy vọng điều này sẽ giúp được ai đó, nếu bạn không cần phải chọn ô.


2

Tôi đã thử rất nhiều đề xuất để khắc phục nhưng không thể sửa được. Cuối cùng, tôi quyết định tùy chỉnh dòng phân cách như sau:

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: tùy chỉnh tại willDisplayCell KHÔNG cellForRowAtIndexPath


1

Khá ngạc nhiên, thay đổi separatorInsetgiá trị của tế bào qua lại dường như đang hoạt động:

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

Tôi cũng gặp vấn đề về hiển thị đường phân cách không nhất quán này ở dưới cùng của UITableView. Sử dụng chế độ xem chân trang tùy chỉnh, tôi đã có thể tạo một dòng tương tự và hiển thị nó trên đầu trang tiềm năng hiện có (đôi khi bị thiếu).

Vấn đề duy nhất của giải pháp này là Apple có thể thay đổi độ dày của đường một ngày

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

Tôi đã giải quyết việc đặt các dòng mã này trong đó bản cập nhật của các chế độ xem bảng:

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

Ví dụ, trong trường hợp của tôi, tôi đã đưa chúng vào đây:

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

1

Bạn cần xóa lựa chọn ô trước khi thực hiện cập nhật ô. Sau đó, bạn có thể khôi phục lựa chọn.

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

Để khắc phục sự cố trên, hãy thêm chân trang trống trong viewDidLoad.

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

Vui lòng không sử dụng các dòng trên trong phương thức ủy nhiệm của viewForFooterInSection. Có nghĩa là không thực hiện phương thức viewForFooterInSection.


0

để mở rộng câu trả lời trên airpaulg, vì nó hoàn toàn không phù hợp với tôi ..

tôi cũng phải thực hiện phương pháp heightforfooter để có được chiều cao

sau đó tôi nhận thấy lightgraycolor quá tối. tôi đã sửa lỗi này bằng cách lấy màu phân cách hiện tại của bảng xem và sử dụng màu đó:

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


0

Tôi cũng gặp vấn đề này trong dự án của chúng tôi. Chế độ xem bảng của tôi có một bảngFooterView có thể thực hiện điều này. Tôi tìm thấy dấu phân cách bên dưới hàng cuối cùng sẽ xuất hiện nếu tôi xóa bảngFooterView đó.


0

Điều làm nên sự khác biệt đối với tôi là tải lại hàng mà dòng phân cách dưới cùng sẽ không xuất hiện:

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

0

Tôi giải quyết vấn đề này theo một cách khác: thêm một lớp có chiều cao của nó là 0,5px và màu của nó là lightgray vào bảngview.tableFooterView làm lớp con của nó.

mã giống như thế này:

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

Trong lớp con UITableViewCell của bạn triển khai layoutSubview và thêm:

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

Như một người khác đã đề cập, vấn đề này dường như biểu hiện theo nhiều cách khác nhau. Tôi đã giải quyết vấn đề của mình thông qua cách giải quyết sau:

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

0

Đi qua các câu trả lời và giải pháp tôi đã đưa ra những quan sát như vậy:

Điều này dường như có vấn đề trong cả iOS 7 và 8. Tôi nhận thấy vấn đề khi chọn ô từ mã trong viewDidLoad phương thức như vậy:

1) cách giải quyết là làm như vậy viewDidAppear:nếu ai đó không bận tâm đến sự chậm trễ đáng chú ý giữa việc trình bày chế độ xem và chọn ô

2) giải pháp thứ hai làm việc cho tôi nhưng mã có vẻ hơi mong manh vì nó dựa trên việc thực hiện bên trong củaUITableViewCell

3) thêm dấu phân tách riêng dường như là linh hoạt nhất và tốt nhất hiện nay nhưng yêu cầu mã hóa nhiều hơn :)


0

Thiết lập phong cách viewWillAppearlàm việc cho tôi.


0

Vì đây vẫn là một vấn đề với iOS 8, tôi sẽ thêm giải pháp của mình vào Swift. Đặt dòng phân cách xem bảng thành không. Sau đó thêm mã này vào phương thức ủy nhiệm của cellForRowAtIndexPath. Nó sẽ thêm một dấu phân cách tốt đẹp. Câu lệnh if cho phép quyết định các ô nào nên có dấu phân cách.

    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

Đây là giải pháp của tôi cho vấn đề này. Sau khi bạn chèn (các) ô của mình, hãy tải lại phần đó. Nếu tải lại toàn bộ phần quá chuyên sâu đối với bạn, chỉ cần tải lại indexPath bên trên và bên dưới.

[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

gặp phải một vấn đề tương tự, tôi thấy rằng một giải pháp tốt khác, đặc biệt là nếu DataSource của bạn không lớn sẽ tải lại bảngData khi bạn triển khai -(void)scrollViewDidScroll:(UIScrollView *)scrollViewphương thức, đây là một ví dụ:

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

      else {
          [self.tableView2 reloadData];
      }
}

Bạn cũng có thể tải lại dữ liệu không nhìn thấy được dựa trên nguồn dữ liệu hiển thị, nhưng điều đó đòi hỏi phải có thêm một số hack.

Hãy ghi nhớ chức năng đại biểu này nằm trong UITableViewDelegate giao thức!

Hy vọng nó giúp!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.