UITableViewCell Separator หายไปใน iOS7


129

ฉันมีปัญหาแปลก ๆUITableViewเฉพาะใน iOS 7

UITableViewCellSeparatorหายไปเหนือแถวแรกและใต้แถวสุดท้าย บางครั้งหลังจากเลือกแถวหรือการเลื่อนบางอย่างปรากฏขึ้น

ในกรณีของฉันtableViewโหลดจากสไตล์ที่Storyboardมี UITableViewStylePlainปัญหาคือก็ไม่ได้อยู่ในที่ไม่ได้เปลี่ยนแปลงจากเริ่มต้นUITableViewCellSeparatorStyleUITableViewCellSeparatorStyleSingleLine

ตามที่ฉันอ่านที่ฟอรัม Apple Dev ( ที่นี่และที่นี่ ) คนอื่น ๆ มีปัญหาดังกล่าวและพบวิธีแก้ปัญหาบางอย่างเช่น:

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

แต่ฉันยังคงค้นหาเหตุผลของพฤติกรรมแปลก ๆ ของตัวคั่นดังกล่าว

ความคิดใด ๆ ?

อัปเดต:อย่างที่ฉันเห็นใน XCode 5.1 DP และ iOS 7.1 beta Apple พยายามแก้ไขปัญหานี้ ตอนนี้ตัวคั่นจะแสดงตามที่จำเป็นบางครั้งด้านล่างแถวสุดท้ายหลังจากรีเฟรชแล้ว แต่ไม่ใช่หลังจากการสร้าง tableview


19
บางครั้งฉันรู้สึกว่า iOS7 ยังไม่บรรลุนิติภาวะ สิ่งนี้และรายการยาว ๆ ที่ฉันมีที่นี่แสดงให้เห็นว่า iOS7 นั้นมาจากความสมบูรณ์แบบของ iOS รุ่นก่อน ๆ มากแค่ไหน
Bms270

1
แอปการตั้งค่าโดย Apple มีปัญหาเดียวกันดังนั้นฉันเชื่อว่านี่เป็นปัญหาของ iOS 7 ฉันได้รายงานไปแล้วและในการติดตามผลพวกเขาขอภาพที่แสดงปัญหา
Johan

@Gatada คุณพบปัญหาตรงไหนในแอปการตั้งค่า
Jamie Forrest

2
พบปัญหาเดียวกันและแก้ไขโดยการเพิ่ม [cell setSeparatorInset: UIEdgeInsetsFromString (@ "1")]; ด้วยใน (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) วิธี indexPath
Ayesha Fatima

1
สิ่งนี้ยังคงดูเหมือนจะใช้งานไม่ได้ในเบต้า iOS 8.0 ฉันได้เปิดเรดาร์ 17724043 แล้วหากใครสนใจที่จะติดตั้งเรดาร์
Andy Wilkinson

คำตอบ:


77

ฉันถ่ายโอนลำดับชั้นมุมมองย่อยของเซลล์ที่ได้รับผลกระทบและพบว่า_UITableViewCellSeparatorViewถูกตั้งค่าเป็นซ่อน มิน่าเล่าถึงไม่ฉาย!

ฉันเอาชนะlayoutSubviewsในไฟล์UITableViewCellคลาสย่อยและตอนนี้ตัวคั่นจะแสดงอย่างน่าเชื่อถือ:

วัตถุประสงค์ -C :

- (void)layoutSubviews {
    [super layoutSubviews];

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

รวดเร็ว :

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

วิธีแก้ปัญหาอื่น ๆ ที่เสนอที่นี่ใช้ไม่ได้ผลสำหรับฉันอย่างสม่ำเสมอหรือดูเหมือนไม่สะดวก (เพิ่มมุมมองส่วนท้าย 1 พิกเซลที่กำหนดเอง)


ฉันใช้วิธีของคุณแล้ว แต่ไม่ได้อยู่ในคลาสย่อยฉันได้เพิ่มหมวดหมู่ใน UITableViewCell มันช่วยฉัน ขอบคุณ
Vitalii Boiarskyi

แน่นอนว่ามันเป็นไปได้ในหมวดหมู่ เนื่องจากสิ่งนี้ต้องใช้วิธีการ swizzling ฉันจึงใช้วิธี subclass แบบง่าย
Ortwin Gentz

3
นี่เป็นทางออกเดียวที่ใช้ได้ผลสำหรับฉัน ปัญหาของฉันเกิดขึ้นเมื่อ UITableView มีแถวเพียงพอที่จะเลื่อนได้ ส่วน "hasSuffix:" นั้นค่อนข้างบอบบาง
juhan_h

ใช้ได้ผลสำหรับฉัน คำถามอาจจะงี่เง่า แต่สิ่งนี้ไม่ได้ใช้ Private API ใช่หรือไม่
Foriger

1
ใช้ได้กับฉันใน iOS9
tounaobun

42

สิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

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

คุณสมควรได้รับคะแนนโหวตมากขึ้นนี่คือสิ่งที่ฉันต้องการฉันเพิ่มไว้ในหมวดหมู่ดังนั้นหลังจากที่ฉันทำ [tableView reloadData] แล้วหากจุดบกพร่องนี้เกิดขึ้น (ในกรณีของฉันตัวคั่นส่วนท้ายที่ซ่อนอยู่จะปรากฏขึ้นอีกครั้ง) ฉันเรียก [tableView reloadSeparators];
NiñoScript

12

ฉันยังมีปัญหากับการแยกขาดหายไปและผมพบว่าปัญหาที่เกิดขึ้นเฉพาะเมื่อheightForRowAtIndexPathได้รับกลับจำนวนทศนิยม สารละลาย:

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

1
จะเกิดอะไรขึ้นถ้าฉันไม่ใช้เมธอดแม้แต่ heightForRowAtIndexPath
BS

น่าสนใจ อย่างไรก็ตามมันเกิดขึ้นในโครงการของฉันเช่นกันและไม่ได้ใช้ heightForRowAtIndexPath ในแถว IB / ความสูงของเซลล์คือ 100
โยฮัน

6
มันไม่ได้แก้ปัญหาสำหรับฉันและฉันมีเมธอด heightForRowAtIndexPath
Gergely Kovacs

แก้ไขปัญหาอย่างน้อยบางส่วน ดูเหมือนเซลล์จะสับสนเกี่ยวกับความสูงที่ไม่ใช่จำนวนเต็ม
Nick Frolov

คุณต้อง จำกัด จำนวนพิกเซลแล้วหารด้วยตัวคูณมาตราส่วนของหน้าจอเพื่อให้ได้คะแนนที่เป็นทศนิยมได้ หากคุณไม่ทำเช่นนี้ก็จะไม่ได้รับการปรับให้เหมาะสมกับเรตินา
trss

11

คุณลองเพิ่มมุมมองความสูง 1 ในส่วนหัวและส่วนท้ายของตารางด้วยสีพื้นหลังสีเทาอ่อนหรือไม่? โดยทั่วไปจะล้อเลียนตัวคั่นแรกและตัวสุดท้าย


ฟังดูดี แต่คุณจะทำอย่างไร ใช้ viewforfooter?
skinsfan00atg

1
ไม่ง่ายอย่างที่คิดด้วยเหตุผลบางอย่างฉันต้องใช้ heightforfooter ด้วยมิฉะนั้นความสูงที่ระบุใน initwithframe จะถูกละเว้น ฉันสังเกตด้วยว่า lightgraycolor ไม่ใช่สีเดียวกันดังนั้นจึงใช้ไม่ได้จริงๆ อาจต้องทำสีเทาแบบกำหนดเอง
skinsfan00atg

นั่นค่อนข้างน่า
เบื่อ

ใช่ฉันเห็นด้วยอย่างเต็มที่ นี่เป็นวิธีแก้ปัญหาเดียวที่ฉันพบหลังจากการเปิดตัว iOS 7 ตอนนี้มีแนวทางที่ดีกว่านี้หรือไม่?
airpaulg

2
ในการจับคู่สีให้ใช้ tableView.separatorColor
Jeff

8

@samvermette

ฉันแก้ไขปัญหาโดยใช้วิธีการมอบหมายนี้ ตอนนี้ไม่สั่นไหว:

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

เราพบปัญหานี้ในแอปของเรา เมื่อผู้ใช้เลือกเซลล์มุมมองตารางใหม่จะถูกดันไปยังสแต็กของตัวควบคุมการนำทางจากนั้นเมื่อผู้ใช้โผล่ออกมาตัวคั่นจะหายไป เราแก้ไขได้โดยการวาง[self.tableView deselectRowAtIndexPath:indexPath animated:NO];ในdidSelectRowAtIndexPathมุมมองตารางวิธีการของผู้ร่วมประชุม


คุณลองแล้วself.tableView.allowsMultipleSelection = NO;หรือยัง?
wrightak

6

นี่คือวิธีแก้ปัญหาที่ง่ายกว่า (แม้ว่าจะยุ่งเล็กน้อย) หากคุณต้องการลองเลือกและยกเลิกการเลือกเซลล์หลังจากโหลดข้อมูลซ้ำและภาพเคลื่อนไหวเริ่มต้นจะเสร็จสิ้น

เพียงแค่เพิ่ม:

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

1
วิธีแก้ปัญหานี้แก้ไขให้ฉัน อย่างไรก็ตามฉันย้อนกลับ - เพื่อคงการเลือกไว้ ก่อนอื่นให้ยกเลิกการเลือกจากนั้นเลือกใหม่
Johan

2
ฉันไม่รู้ว่าจะแทนที่อะไรเมื่อคุณพูดว่า "หลังจากโหลดข้อมูลใหม่แล้ว"
airpaulg

6

ฉันพบว่าวิธีที่ง่ายที่สุดคือหลังจากโหลดเซลล์ใหม่แล้วให้โหลดเซลล์ด้านบนซ้ำด้วย:

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

1
ทำงานให้ฉัน ขอบคุณ วิธีอื่น ๆ ไม่ได้ช่วยฉัน (รวมถึงการเปลี่ยนสไตล์ตัวคั่นจากคำตอบของ samvermette)
surfrider

4

โซลูชันที่เรียบง่ายและสะอาดซึ่งใช้ได้กับทั้ง iOS 8 และ iOS 9 (เบต้า 1)

นี่คือวิธีแก้ปัญหาที่เรียบง่ายสะอาดและไม่ล่วงล้ำ มันเกี่ยวข้องกับการเรียกเมธอดหมวดหมู่ที่จะแก้ไขตัวคั่น

สิ่งที่คุณต้องทำคือเดินไปตามลำดับชั้นของเซลล์และยกเลิกการซ่อนตัวคั่น แบบนี้:

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

สิ่งที่ฉันแนะนำคือเพิ่มสิ่งนี้ในหมวดหมู่บน UITableViewCell เช่นนี้:

@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

เนื่องจากตัวคั่นสามารถหายไปในเซลล์อื่นนอกเหนือจากที่เลือกไว้ในปัจจุบันจึงเป็นความคิดที่ดีที่จะเรียกการแก้ไขนี้กับเซลล์ทั้งหมดในมุมมองตาราง สำหรับสิ่งนั้นคุณสามารถเพิ่มหมวดหมู่ให้กับ UITableView ซึ่งจะเป็นดังนี้:

@implementation UITableView (fixSeparators)

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

@end

ด้วยสิ่งนี้คุณสามารถเรียก-fixSeparatosใช้ tableView ของคุณได้ทันทีหลังจากการกระทำที่ทำให้พวกเขาหายไป ในกรณีของฉันคือหลังจากโทร[tableView beginUpdates]และ[tableView endUpdates].

ตามที่ฉันได้กล่าวไว้ในตอนต้นฉันได้ทดสอบสิ่งนี้ทั้งบน iOS 8 และ iOS 9 ฉันคิดว่ามันจะใช้งานได้แม้ใน iOS 7 แต่ฉันไม่มีวิธีลองที่นั่น ดังที่คุณอาจทราบแล้วสิ่งนี้จะทำให้เกิดการสอดประสานกับภายในของเซลล์ดังนั้นจึงอาจหยุดทำงานในบางรุ่นในอนาคต และในทางทฤษฎี Apple อาจปฏิเสธแอปของคุณ (โอกาส 0.001%) เพราะเหตุนี้ แต่ฉันไม่เห็นว่าพวกเขาจะรู้ได้อย่างไรว่าคุณกำลังทำอะไรอยู่ที่นั่น (การตรวจสอบคำต่อท้ายของคลาสไม่สามารถตรวจพบได้โดยเครื่องวิเคราะห์แบบคงที่ ไม่ดี IMO)


ใช่. สิ่งนี้ใช้ได้ผลสำหรับฉันหลังจากแปลงเป็น Swift เวอร์ชันล่าสุด ++ สำหรับการเรียกใช้ fixSeparators ทุกครั้งหลังเรียก tableView.endUpdates ()
ObjectiveTC

1
ฉันดีใจที่นี่เป็นประโยชน์กับคุณ! ฉันเชื่อจริงๆว่านี่เป็นทางออกที่ดีที่สุดดังนั้นหวังว่าจะมีคนค้นพบมากขึ้น
Lukas Petr

4

ตามความคิดเห็นของ @ ortwin-gentz โซลูชันนี้ใช้ได้กับฉันใน 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)

ฉันใช้ฟังก์ชัน fixCellsSeparator ()หลังจากเรียกendUpdates ()ในบางวิธีของ tableView ของฉันเช่น:

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

    //  Perform some stuff
    //  ...

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

}

ฉันหวังว่าโซลูชันนี้จะเป็นประโยชน์สำหรับใครบางคน!


2

เติมเต็มคำตอบของ airpaulg

โดยพื้นฐานแล้วเราต้องใช้สองวิธี UITableDelegate นี่คือวิธีแก้ปัญหาของฉันซึ่งใช้ได้กับทั้ง iOS7 และ 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]

// สิ่งนี้จะซ่อนตารางว่างด้านล่างเซลล์หากไม่ครอบคลุมทั้งหน้าจอ

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

สิ่งนี้ได้แก้ไขปัญหาให้ฉัน:

ตรวจสอบให้แน่ใจclipsToBoundsถูกตั้งไว้ที่ใช่สำหรับเซลล์ contentViewแต่ไม่มีของเซลล์ ตั้งค่าด้วยcell.contentView.backgroundColor = [UIColor clearColor];


การตั้งค่า clipSubviews เป็นเท็จในกระดานเรื่องราวสำหรับทั้งเซลล์และ contentView ช่วยแก้ปัญหาได้! ต้องการคะแนนโหวตมากขึ้น!
Brett

การตั้งค่า clipsToBounds เป็น YES บนเซลล์ก็เพียงพอแล้วสำหรับฉัน
Rene Juuse

2

ดูเหมือนว่าปัญหานี้จะปรากฏขึ้นภายใต้สถานการณ์มากมาย

สำหรับฉันมันเกี่ยวข้องกับการเลือกเซลล์ ฉันไม่รู้ว่าทำไมและไม่มีเวลาเจาะลึกเกินไป แต่ฉันสามารถพูดได้ว่ามันเริ่มเกิดขึ้นเมื่อฉันตั้งค่าเซลล์เป็นselectionStyleไม่มี เช่น:

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

ฉันลองใช้วิธีการมอบสิทธิ์บางวิธีข้างต้นที่เปิดและปิดseparatorStyle คุณสมบัติของคุณสมบัติtableViewแต่ดูเหมือนจะไม่ได้ทำอะไรเพื่อแก้ไขปัญหาของฉัน

เหตุผลทั้งหมดที่ฉันต้องการก็เพราะว่าฉันไม่จำเป็นต้องเลือกเซลล์ด้วยซ้ำ

ดังนั้นฉันพบสิ่งที่เหมาะกับตัวเอง ฉันเพิ่งปิดการใช้งานการเลือกบนUITableView:

tableView.allowsSelection = NO;

หวังว่านี่จะช่วยใครบางคนหากคุณไม่จำเป็นต้องเลือกเซลล์


2

ฉันลองใช้คำแนะนำมากมายเพื่อแก้ไข แต่ไม่สามารถแก้ไขได้ในที่สุดฉันก็ตัดสินใจเลือกเส้นคั่นที่กำหนดเองดังนี้:

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ไม่ใช่cellForRowAtIndexPath


1

ค่อนข้างน่าแปลกใจที่การเปลี่ยนseparatorInsetค่าของเซลล์ไปมาดูเหมือนจะได้ผล:

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

ฉันยังมีปัญหาของการแสดงเส้นคั่นที่ไม่สอดคล้องกันที่ด้านล่างของ UITableView ของฉัน ด้วยการใช้มุมมองส่วนท้ายที่กำหนดเองฉันสามารถสร้างบรรทัดที่คล้ายกันและแสดงไว้ที่ด้านบนของมุมมองที่เป็นไปได้ที่มีอยู่ (ซึ่งบางครั้งก็หายไป)

ปัญหาเดียวของการแก้ปัญหานี้คือ Apple อาจเปลี่ยนความหนาของเส้นในวันหนึ่ง

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

ฉันได้แก้ไขการวางบรรทัดของโค้ดเหล่านี้เพื่อให้การอัปเดตของ tableview มีขึ้น

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

ตัวอย่างเช่นในกรณีของฉันฉันได้ใส่ไว้ที่นี่:

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

1

คุณต้องลบการเลือกเซลล์ออกก่อนที่จะทำการอัปเดตเซลล์ จากนั้นคุณสามารถกู้คืนการเลือกได้

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

ในการแก้ไขปัญหาข้างต้นให้เพิ่มส่วนท้ายว่างใน viewDidLoad

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

โปรดอย่าใช้บรรทัดด้านบนในเมธอดผู้ร่วมประชุม viewForFooterInSection หมายถึงอย่าใช้เมธอด viewForFooterInSection


0

เพื่อขยายคำตอบของ airpaulg เพราะมันไม่ได้ผลสำหรับฉันเลย ..

ฉันต้องใช้วิธี heightforfooter ด้วยเพื่อให้ได้ความสูง

จากนั้นฉันสังเกตเห็นว่า lightgraycolor มืดเกินไป ฉันแก้ไขสิ่งนี้โดยการจับสีตัวคั่นปัจจุบันของมุมมองตารางและใช้สิ่งนั้น:

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


0

ฉันยังพบปัญหานี้ในโครงการของเรา มุมมองตารางของฉันมี tableFooterView ซึ่งอาจทำให้สิ่งนี้เกิดขึ้นได้ ฉันพบว่าตัวคั่นด้านล่างแถวสุดท้ายจะปรากฏขึ้นหากฉันลบ tableFooterView นั้นออก


0

สิ่งที่สร้างความแตกต่างให้กับฉันคือการโหลดแถวใหม่ซึ่งบรรทัดตัวคั่นล่างจะไม่ปรากฏขึ้น:

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

0

ฉันแก้ปัญหานี้ด้วยวิธีอื่น: เพิ่มเลเยอร์ที่มีความสูง 0.5px และสีของมันคือ lightgray ใน tableview.tableFooterView เป็นเลเยอร์ย่อย

รหัสเป็นแบบนี้:

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 Subclass ของคุณใช้ layoutSubviews และเพิ่ม:

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

ตามที่มีคนกล่าวถึงปัญหานี้ดูเหมือนจะปรากฏในหลาย ๆ ฉันแก้ไขปัญหาของฉันด้วยวิธีแก้ปัญหาต่อไปนี้:

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

0

จากคำตอบและแนวทางแก้ไขฉันได้ข้อสังเกตดังกล่าว:

ดูเหมือนว่าจะมีปัญหาทั้งใน iOS 7 และ 8 ฉันสังเกตเห็นปัญหาเมื่อเลือกเซลล์จากโค้ดใน viewDidLoadวิธีการ:

1) วิธีแก้ปัญหาคือทำเช่นนั้นviewDidAppear:หากมีคนไม่สนใจความล่าช้าที่เห็นได้ชัดเจนระหว่างการนำเสนอมุมมองและการเลือกเซลล์

2) โซลูชันที่สองใช้งานได้สำหรับฉัน แต่โค้ดดูบอบบางเล็กน้อยเนื่องจากอิงจากการใช้งานภายในของไฟล์UITableViewCell

3) การเพิ่มตัวคั่นของตัวเองดูเหมือนจะยืดหยุ่นและดีที่สุดสำหรับตอนนี้ แต่ต้องการการเข้ารหัสมากขึ้น :)



0

เนื่องจากยังคงเป็นปัญหากับ IOS 8 ฉันจะเพิ่มโซลูชันของฉันใน Swift ตั้งค่าเส้นคั่นมุมมองตารางเป็นไม่มี จากนั้นเพิ่มรหัสนี้ในเมธอดมอบหมาย cellForRowAtIndexPath มันจะเพิ่มตัวคั่นที่ดี คำสั่ง if ช่วยในการตัดสินใจว่าเซลล์ใดควรมีตัวคั่น

    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

นี่คือวิธีแก้ปัญหาของฉัน หลังจากที่คุณแทรกเซลล์ของคุณแล้วให้โหลดส่วนนี้ซ้ำ หากการโหลดซ้ำทั้งส่วนนั้นหนักเกินไปสำหรับคุณให้โหลด indexPaths ด้านบนและด้านล่างซ้ำ

[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

พบปัญหาที่คล้ายกันฉันพบว่าทางออกที่ดีอีกวิธีหนึ่งโดยเฉพาะอย่างยิ่งหากแหล่งข้อมูลของคุณมีขนาดไม่ใหญ่ให้โหลด tableData ซ้ำเมื่อคุณใช้-(void)scrollViewDidScroll:(UIScrollView *)scrollViewวิธีการนี่คือตัวอย่าง:

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

      else {
          [self.tableView2 reloadData];
      }
}

นอกจากนี้คุณยังสามารถโหลดข้อมูลที่ไม่สามารถมองเห็นได้อีกครั้งโดยอิงจากแหล่งข้อมูลที่มองเห็นได้ แต่ต้องมีการแฮ็กเพิ่มเติม

โปรดทราบว่าฟังก์ชันผู้ร่วมประชุมนี้อยู่ภายใต้UITableViewDelegateโปรโตคอล!

หวังว่าจะช่วยได้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.