“ ยังคงต้องใช้การจัดวางอัตโนมัติหลังจากเรียกใช้ -layoutSubviews” ด้วยคลาสย่อย UITableViewCell


115

ใช้ XCode 4.5 และ iOS 6 ฉันกำลังพัฒนาแอปที่มีมุมมองตารางแบบง่ายพร้อมเซลล์ที่กำหนดเอง ฉันทำสิ่งนี้เป็นร้อยครั้งแล้วใน iOS 5 และต่ำกว่า แต่ด้วยเหตุผลบางประการระบบ autoLayout ใหม่ทำให้ฉันมีปัญหามากมาย

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

*** การยืนยันล้มเหลวใน - [ShopCell layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776

*** การยุติแอปเนื่องจากข้อยกเว้นที่ไม่ถูกจับ 'NSInternalInconsistencyException' เหตุผล: 'ยังคงต้องใช้เค้าโครงอัตโนมัติหลังจากดำเนินการ -layoutSubviews การใช้งาน -layoutSubviews ของ ShopCell จำเป็นต้องโทรหา super '

ฉันไม่ได้ใช้เมธอด -layoutSubviews ในเซลล์คลาสย่อยของฉัน (ShopCell) และแม้ว่าฉันจะพยายามทำเช่นนั้นและเพิ่มการโทรขั้นสูงตามที่แนะนำฉันก็ยังคงได้รับข้อผิดพลาดเดียวกัน ถ้าฉันลบมุมมองย่อยออกจากเซลล์ใน IB และเปลี่ยนเป็น UITableViewCell มาตรฐานทุกอย่างจะทำงานตามที่คาดไว้แม้ว่าฉันจะไม่เหลือข้อมูลในเซลล์ก็ตาม

ฉันเกือบจะแน่ใจแล้วว่ามีบางอย่างง่ายๆที่ฉันขาดหายไป แต่ไม่พบเอกสารหรือคำแนะนำใด ๆ ที่จะแนะนำสิ่งที่ฉันทำผิด ความช่วยเหลือใด ๆ จะได้รับการชื่นชม

แก้ไข:เพิ่งลองเปลี่ยนเป็น UITableViewCell ใน IB และปล่อยมุมมองย่อยทั้งหมดไว้ แต่ยังคงเป็นข้อผิดพลาดเหมือนเดิม


ลองlldb [[UIWindow keyWindow] _autoLayoutTrace]ที่พื้นที่ดีบักเกอร์หากใช้รูปแบบอัตโนมัติ
A-Live

3
คุณใช้ UIView สำหรับเซลล์ที่กำหนดเองแทน UITableViewCell หรือไม่? ผมมีปัญหาเหมือนกัน. ฉันมี UIView สำหรับเซลล์ที่กำหนดเองและกำลังเพิ่มมุมมองย่อยลงในนั้น เปลี่ยนเป็น UITableViewCell และใช้งานได้

เฮ้ไมค์คุณกำหนดร้านค้าอย่างไร? คุณสมบัติเหล่านี้อยู่ในไฟล์การนำไปใช้งานของคุณในนามสกุลคลาสหรือไม่?
kocodude

@ A-Live เมื่อใดก็ตามที่ฉันพยายามใช้วิธีนั้นฉันได้รับข้อผิดพลาดในการดีบักเกอร์ .... วิธีนี้ยังใช้ได้หรือไม่? แก้ไข: ไม่เป็นไรมันเป็นตัวพิมพ์เล็ก l ในการเลือกอัตโนมัติ
borrrden

ยกเลิกการเลือกช่อง autoLayout ในตัวตรวจสอบจากนั้นล้างและเรียกใช้ มันจะทำงานได้ดี
Nico

คำตอบ:


57

ฉันพบปัญหาเดียวกันขณะเพิ่มข้อ จำกัด ในโค้ดด้วยตนเอง ในรหัสฉันกำลังทำสิ่งต่อไปนี้:

{
    [self setTranslatesAutoresizingMaskIntoConstraints:YES];
    [self addSubview:someView];
    [self addSubview:someOtherView];
    [self addConstraint:...];
}

สมมติฐาน

จากสิ่งที่ฉันบอกได้ปัญหาก็คือเมื่อคุณปิดใช้งานtranslatesAutoresizingMaskIntoConstraintsUITableViewCell จะเริ่มใช้การจัดวางอัตโนมัติและล้มเหลวโดยธรรมชาติเนื่องจากการใช้งานพื้นฐานlayoutSublayersForLayerไม่ได้เรียก super คนที่มี Hopper หรือเครื่องมืออื่น ๆ สามารถยืนยันสิ่งนี้ได้ เนื่องจากคุณใช้ IB คุณอาจสงสัยว่าเหตุใดจึงเป็นปัญหา ... และนั่นเป็นเพราะการใช้ IB ปิดการใช้งานโดยอัตโนมัติtranslatesAutoresizingMaskIntoConstraintsสำหรับมุมมองที่เพิ่มข้อ จำกัด (จะเพิ่มข้อจำกัดความกว้างและความสูงให้โดยอัตโนมัติ)

สารละลาย

วิธีแก้ปัญหาของฉันคือย้ายทุกอย่างไปที่ไฟล์contentView.

{
   [self.contentView addSubview:someView];
   [self.contentView addSubview:someOtherView];
   [self.contentView addConstraint:...];
}

ฉันไม่แน่ใจ 100% ว่าจะใช้งานได้ในตัวสร้างอินเทอร์เฟซหรือไม่ แต่ถ้าคุณผลักดันทุกอย่างออกจากเซลล์ของคุณ (สมมติว่าคุณมีบางอย่างอยู่ในนั้นโดยตรง) ก็ควรใช้งานได้ หวังว่านี่จะช่วยคุณได้!


4
ฉันยังต้องเพิ่มsubview.translatesAutoresizingMaskIntoConstraints = NO'ในแต่ละมุมมองย่อยที่ฉันเพิ่มลงใน contentView
Jay Peyer

5
สิ่งนี้ได้ผลสำหรับฉัน นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณไม่ได้เรียกself.contentView.translatesAutoresizingMaskIntoConstraints = NOใช้ไฟล์UITableViewCell.
Maurizio

53

เห็นได้ชัดว่าการใช้ LayoutSubviews ของ UITableViewCell ไม่เรียก super ซึ่งเป็นปัญหากับรูปแบบอัตโนมัติ ฉันสนใจที่จะดูว่าการวางหมวดหมู่ด้านล่างลงในโครงการจะช่วยแก้ปัญหาได้หรือไม่ ช่วยในโครงการทดสอบ

#import <objc/runtime.h>
#import <objc/message.h>

@implementation UITableViewCell (FixUITableViewCellAutolayoutIHope)

+ (void)load
{
    Method existing = class_getInstanceMethod(self, @selector(layoutSubviews));
    Method new = class_getInstanceMethod(self, @selector(_autolayout_replacementLayoutSubviews));

    method_exchangeImplementations(existing, new);
}

- (void)_autolayout_replacementLayoutSubviews
{
    [super layoutSubviews];
    [self _autolayout_replacementLayoutSubviews]; // not recursive due to method swizzling
    [super layoutSubviews];
}

@end

ฉันอาจเพิ่มปัญหาที่ปรากฏขึ้นให้ฉันเมื่อใช้ backgroundView บนเซลล์ตารางเนื่องจากจะถูกเพิ่มเป็นมุมมองย่อยไปยังเซลล์ (ในขณะที่มุมมองย่อยส่วนใหญ่ควรเพิ่มลงใน contentView ของเซลล์ตารางซึ่งโดยปกติควรจะทำงานได้ดีกว่า)

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


สิ่งที่แปลกคือมันใช้งานได้ดีกับ UITableViewCell ธรรมดาสำหรับฉันไม่ใช่สำหรับคลาสย่อย ...
borrrden

คุณคงคิดอย่างนั้น แต่ทั้งหมดที่ฉันมีคือวิธีการเริ่มต้นไม่มีอะไรอื่น> <. ฉันไม่เคยลบล้างเลย์เอาต์ย่อยในชีวิตเลยฮ่า ๆ ฉันคิดว่าปัญหาคือมุมมองแบบกำหนดเองที่ UITableViewCell ใช้เป็นมุมมองรูทไม่สามารถใช้เลย์เอาต์อัตโนมัติได้เพราะมันจะลบล้าง layoutSubviews (ดังนั้นเมื่อคุณพยายามเพิ่มข้อ จำกัด ในมุมมองรูทมันจะล้มเหลว)
borrrden

6
ฉันต้องสร้างหมวดหมู่ดังกล่าวUITableViewด้วยเหตุผลเดียวกัน (iOS 6.1 b1)
Joshua J.McKinnon

5
TableHeaderView มีการแก้ไขที่คล้ายกันหรือไม่เนื่องจากปัญหายังคงมีอยู่ใน iOS 7
Softlion

1
ใช้งานได้ดี ฉันพบปัญหานี้เมื่อฉันพยายามจัดกึ่งกลางมุมมองย่อย UIVIew ใน UITableView แม้ใน iOS 7 การยืนยันจะเกิดขึ้น แต่จะไม่เกิดขึ้นใน iOS 8 ดังนั้นพวกเขาจึงต้องแก้ไขข้อบกพร่อง
Jordan H

33

ฉันมีข้อบกพร่องเดียวกันมาสองสามเดือน แต่ฉันพบว่าอะไรคือปัญหา

เมื่อฉันสร้างไฟล์ IB UIViewจะมีการเพิ่มไฟล์ไว้แล้ว หากคุณใช้มุมมองนี้แอปจะไม่ขัดข้องเมื่อปิดใช้งานการออกแบบอัตโนมัติ (แต่มีปัญหาอื่น ๆ ) เมื่อคุณใช้รูปแบบอัตโนมัติคุณต้องเลือกทางขวาUITableViewCellมุมมองในไลบรารีวัตถุ:

ในความเป็นจริงคุณควรใช้รายการนี้เสมอเนื่องจากมีการเพิ่มมุมมองย่อยทั้งหมดลงในcontentViewไฟล์UITableViewCell.

นั่นคือทั้งหมด ทั้งหมดจะดี


นี่ไม่ควรเป็นคำตอบที่ได้รับการยอมรับเนื่องจากคำถามไม่ได้เกี่ยวกับการนำไปใช้งานโดยใช้ IB และเนื่องจากปัญหานี้อาจเกิดขึ้นได้เมื่อคุณไม่ได้ใช้ IB หากคุณกำลังดูตามโปรแกรมคำตอบของ @ PhilLoden นั้นมีประโยชน์มากกว่า
Eric

ฉันไม่เข้าใจคำตอบ ใครช่วยอธิบายให้ชัดเจนกว่านี้หน่อย ขอบคุณ
hasan

ฉันคิดว่าฉันมีสิทธิ์นั้น ตรวจสอบชั้นเรียนได้เพียงพอหรือไม่ ในตัวตรวจสอบข้อมูลประจำตัวในตัวสร้างอินเทอร์เฟซ? หรือสิ่งที่เพิ่มเข้ามานั้นเป็นประเภทอื่นและคลาสอื่น ได้รับการปรับปรุงในภายหลัง? นั่นยังทำให้เกิดปัญหาหรือไม่
hasan

@ hasan83 คืนเซลล์ได้จริง UITableViewCell นั้นเป็น UIView ที่มีตัวระบุการใช้ซ้ำ
Arnaud

17

ฉันมีปัญหาเดียวกันกับ custom UITableViewHeaderFooterView+ xib

ฉันเห็นคำตอบบางส่วนที่นี่ แต่ฉันพบว่าการใช้งานใด-layoutSubviewsในคลาสมุมมองส่วนท้ายที่กำหนดเองของฉันแก้ไขปัญหาได้:

-(void)layoutSubviews
{
    [super layoutSubviews];
    [self layoutIfNeeded]; // this line is key
}

1
ระวังว่าสิ่งนี้อาจทำให้เกิดการวนซ้ำไม่รู้จบและสุดท้ายEXC_BAD_ACCESS KERN_PROTECTION_FAILURE
mbi

15

ฉันเห็นสิ่งนี้เป็นผลมาจากการแก้ไขข้อ จำกัด ในการใช้ layoutSubviews ของฉัน การย้ายสายไปที่ super จากจุดเริ่มต้นไปยังจุดสิ้นสุดของวิธีนี้ช่วยแก้ปัญหาได้


สิ่งนี้ได้ผลสำหรับฉัน ฉันมี UICollectionViewCell ที่กำหนดเองซึ่งฉันกำลังจัดรูปแบบใน layoutSubviews ใครรู้ว่าทำไมวิธีนี้ถึงใช้งานได้?
STANGMMX

@STANGMMX คำตอบของ A'sa Dickens อธิบายว่าทำไม
Fábio Oliveira

15

มีปัญหาเดียวกันใน iOS 7 (ดูเหมือนว่า iOS 8 จะแก้ไขได้) วิธีแก้ปัญหาสำหรับฉันคือโทรไป[self.view layoutIfNeeded]ที่ส่วนท้ายของviewDidLayoutSubviewsวิธีการของฉัน


ขอบคุณ. ช่วยฉันได้ฉันพบปัญหานี้เมื่อวานนี้ (บน iOS 7) มันช่วยได้สำหรับ iOS 7
Alexander

@MaciejSwic ดูคำตอบของฉันที่ด้านบน
Sound Blaster

สิ่งนี้ได้ผลสำหรับฉัน! ใช้ iOS 7.1 กับ Swift ฉันกำลังลบและเพิ่มข้อ จำกัด ใน viewDidLayoutSubviews ฉันลบซูเปอร์โทรออกแล้ว แต่ก็ยังใช้งานไม่ได้ แต่วิธีนี้ทำได้จริง! ให้ไดโนเสาร์ใบนี้! :)
jomafer

ทำงานให้ฉันด้วยโดยใช้ iOS 7.1!
fdlr

14

ฉันมีปัญหาเดียวกัน ปัญหาอยู่ระหว่างการสร้างเซลล์ Xib ฉันสร้าง Xib เหมือนปกติและเพิ่งเปลี่ยนประเภทของ "UIView" เริ่มต้นเป็นคลาส UITableViewCell ที่กำหนดเองของฉัน วิธีที่ถูกต้องคือลบมุมมองเริ่มต้นก่อนจากนั้นลากวัตถุเซลล์มุมมองตารางไปที่ xib รายละเอียดเพิ่มเติมที่นี่: http://allplayers.github.io/blog/2012/11/18/Custom-UITableViewCell-With-NIB/


1
ข้อมูลเชิงลึกที่สมบูรณ์แบบ! ฉันต้องใช้เวลานานกว่าจะรู้ว่าโดยเฉพาะอย่างยิ่งเพราะแอปของฉันจะไม่ขัดข้องหากฉันใช้ UIView ที่ปิดใช้งาน AutoLayout
Guilherme

Super! ดู @Arnaud respone ด้านล่างด้วย
Lubbo

7

ฉันแก้ไขปัญหาโดยการปิด "การจัดวางอัตโนมัติ" สำหรับมุมมองย่อยทั้งหมดของเซลล์มุมมองตารางที่กำหนดเองของฉัน

ใน xib สำหรับเซลล์แบบกำหนดเองเลือกมุมมองย่อยและยกเลิกการเลือกตัวตรวจสอบไฟล์> เอกสารตัวสร้างส่วนต่อประสาน> ใช้การจัดวางอัตโนมัติ


4
ฉันทำเช่นเดียวกัน ไม่ใช่วิธีแก้ปัญหา แต่ถ้าคุณต้องการใช้ระบบ
จ่ายอัตโนมัติ

7

ฉันมีปัญหาที่คล้ายกันไม่ได้เกิดขึ้นUITableViewCellแต่อยู่ที่UITableViewตัวมันเอง เนื่องจากเป็นผลลัพธ์แรกใน Google ฉันจะโพสต์ไว้ที่นี่ ปรากฎว่าviewForHeaderInSectionเป็นปัญหา ฉันสร้างUITableViewHeaderFooterViewและตั้งค่าtranslatesAutoresizingMaskIntoConstraintsเป็นNO. ตอนนี้มาถึงส่วนที่น่าสนใจ:

ไอโอเอส 7:

// don't do this on iOS 7
sectionHeader.translatesAutoresizingMaskIntoConstraints = NO;

หากฉันทำเช่นนี้แอปขัดข้องด้วย

ยังคงต้องใช้รูปแบบอัตโนมัติหลังจากดำเนินการ -layoutSubviews การใช้งาน -layoutSubviews ของ UITableView จำเป็นต้องเรียกใช้ super

ตกลงฉันคิดว่าคุณไม่สามารถใช้การจัดวางอัตโนมัติบนส่วนหัวของมุมมองตารางและเฉพาะในมุมมองย่อย แต่นั่นไม่ใช่ความจริงทั้งหมดอย่างที่คุณเห็นในภายหลัง สรุป: อย่าปิดใช้งานการปรับขนาดมาสก์อัตโนมัติสำหรับส่วนหัวบน iOS 7มิฉะนั้นจะทำงานได้ดี

iOS 8:

// you have to do this, otherwise you get an auto layout error
sectionHeader.translatesAutoresizingMaskIntoConstraints = NO;

ถ้าฉันไม่ใช้สิ่งนี้ฉันจะได้ผลลัพธ์ดังต่อไปนี้:

ไม่สามารถปฏิบัติตามข้อ จำกัด พร้อมกันได้

สำหรับ iOS 8 คุณต้องปิดการใช้งานมาสก์การปรับขนาดอัตโนมัติสำหรับส่วนหัว

ไม่รู้ว่าทำไมมันถึงทำงานในลักษณะนี้ แต่ดูเหมือนว่า Apple ได้แก้ไขบางสิ่งใน iOS 8 และการจัดวางอัตโนมัติทำงานแตกต่างกันบน iOS 7 และ iOS 8


เพื่อนคุณช่วยวันของฉัน!
Marcin Małysz

5

ตามที่ใครบางคนได้กล่าวไว้ข้างต้นแล้วเมื่อคุณสร้างมุมมองเพื่อใช้ใน UITableView คุณต้องลบมุมมองที่สร้างขึ้นโดยค่าเริ่มต้นและลาก UITableViewCell หรือ UITableViewHeaderFooterView เป็นมุมมองรูท อย่างไรก็ตามมีวิธีแก้ไข XIB ในกรณีที่คุณพลาดส่วนนั้นไป คุณต้องเปิดไฟล์ XIB ในโปรแกรมแก้ไขข้อความและในแท็กรากและเพิ่มเด็กโดยตรง / เปลี่ยนแอตทริบิวต์translatesAutoresizingMaskIntoConstraintsที่จะYESยกตัวอย่างเช่น

<view contentMode="scaleToFill" horizontalHuggingPriority="1000" id="1" translatesAutoresizingMaskIntoConstraints="YES" customClass="MXWCollapsibleTableHeaderView">


2

ฉันกำลังพบกับสิ่งนี้และดูเหมือนว่ามันเกี่ยวข้องกับคลาสย่อย UITableViewCell เป็นเซลล์ต้นแบบที่มีคลาสย่อย UIView ที่กำหนดเองอื่น ๆ เพิ่มเข้ามาโดยเฉพาะ ฉันเน้นที่ 'กำหนดเอง' ที่นี่เพราะฉันประสบความสำเร็จกับเซลล์ที่เพิ่งมีลูก UIKit แต่มันล้มเหลวเมื่อพยายามสร้างข้อ จำกัด สำหรับมุมมองที่ฉันสร้างขึ้นตามความต้องการโดยโยนข้อผิดพลาดที่ระบุไว้ในคำถามของผู้เขียน

ฉันต้องแยกเซลล์ออกเป็นไส้ปากกาอิสระที่ไม่ได้ใช้ AutoLayout

หวังว่า Apple จะกำจัดความยุ่งเหยิงนี้



1

ฉันพบสิ่งนี้เนื่องจากตอนแรกฉันได้เพิ่ม UIView แทน UITableViewCell ลงในไฟล์ xib


1

ฉันกำจัดข้อผิดพลาดนี้โดยการแยกbackgroundViewตัวเชื่อมต่อออกจากพื้นหลังUIImageViewและaccessoryViewตัวเชื่อมต่อจากการUIButtonปรับแต่งของฉัน ฉันสงสัยว่าสิ่งเหล่านี้ไม่ได้ตั้งใจให้ใช้ในแบบที่ฉันใช้


1

ฉันพบปัญหานี้เป็นครั้งแรกในวันนี้ จนถึงตอนนี้ฉันมีประสบการณ์ที่หลากหลายในการใช้คลาสย่อย UITableViewCell ต้นแบบ แต่ไม่เคยพบปัญหานี้ สิ่งที่แตกต่างกันเกี่ยวกับเซลล์ที่ฉันทำงานด้วยคือฉันมี IBOutlet ไปยัง -backgroundView ซึ่งฉันใช้เพื่อระบายสีเซลล์ ฉันพบว่าถ้าฉันสร้างคุณสมบัติใหม่และยังคงเพิ่ม UIView ใหม่ซึ่งยืดช่วงของเซลล์ทั้งหมดการยืนยันนี้จะหายไป เพื่อตรวจสอบว่านี่คือสาเหตุฉันกลับไปที่การแนบมุมมองนี้เข้ากับเต้าเสียบ backgroundView และการยืนยันก็ปรากฏขึ้นอีกครั้ง จนถึงตอนนี้ไม่มีปัญหาอื่น ๆ ในการใช้ AutoLayout ใน UITableViewCell ต้นแบบคลาสย่อยเนื่องจากฉันได้ทำการเปลี่ยนแปลงนี้


1

ฉันไม่ได้รับวิธีแก้ไขที่เหมาะสมสำหรับปัญหานี้ แต่คุณสามารถแก้ไขได้โดยใช้ frames และไม่ได้ตั้งค่าคุณสมบัติ translatesAutoresizingMaskIntoConstraints เป็น No (โดยค่าเริ่มต้นเป็นใช่ดังนั้นอย่าตั้งค่า)

CGRect headerViewFrame = CGRectMake(0,0,320,60); //Frame for your header/footer view
UIView *tableHeaderView = [[UIView alloc] initWithFrame:headerViewFrame];
tableHeaderView.translatesAutoresizingMaskIntoConstraints = Yes; //Or don't set it at all
[self.tableView setTableHeaderView:tableHeaderView];

0

ฉันได้รับประสบการณ์เดียวกัน ปรากฎว่าหากคุณเพิ่มมุมมองย่อยทางโปรแกรมจาก ShopCell .xib / storyboard ของคุณซึ่งใช้เค้าโครงอัตโนมัติเป็นมุมมองย่อยไปยังมุมมองอื่นข้อยกเว้นนั้นอาจถูกโยนทิ้งขึ้นอยู่กับวิธีกำหนดค่าข้อ จำกัด ของคุณ ฉันเดาว่าข้อ จำกัด ที่สร้างขึ้นใน IB คือสิ่งที่สร้างปัญหาเมื่อเพิ่มมุมมองเป็นมุมมองย่อยโดยทางโปรแกรมเนื่องจากเป็นข้อ จำกัด การบำรุงรักษาจาก viewA -> viewB ในขณะที่คุณอาจเพิ่ม viewB เป็นมุมมองย่อยของ viewC คุณเข้าใจแล้ว (ประโยคนั้นยังสับสนในตัวเอง)?

ในสถานการณ์ของฉัน - เนื่องจากเป็นมุมมองที่ง่ายมากที่ทำให้เกิดปัญหา - ฉันสร้างมุมมองโดยใช้โปรแกรมไม่ใช่ใน IB ที่แก้ไขได้ คุณอาจแตกมุมมองเหล่านั้นไปยังไฟล์ xib อื่น ๆ และปิดใช้งานการจัดวางอัตโนมัติสำหรับไฟล์เหล่านั้น ฉันเดาว่าคงได้ผล


0

ในบางสถานการณ์วิธีนี้จะช่วยแก้ปัญหาการจัดวางได้อย่างง่ายดาย (ขึ้นอยู่กับเค้าโครงของคุณ) ภายในคลาสย่อย UITableView ของคุณไม่ว่าจะเป็น AwakenFromNib หรือ init ให้ตั้งค่า autoresizing mask:

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

โดย defaut ตั้งค่าเป็น UIViewAutoresizingNone


สิ่งนี้ช่วยแก้ปัญหาที่ฉันเผชิญอยู่ ฉันใช้อัตโนมัติรูปแบบภายในเซลล์ของตารางรวมกับการที่จะได้รับความสูงซึ่งผมก็ใช้ในการ[tableViewCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height heightForRowAtIndexPath
NathanAldenSr

0

ในกรณีของฉัน

UIImageView ที่อ้างอิงสำหรับโครงร่างอัตโนมัติสำหรับ UITableView ถูกกำหนดให้กับ backgroundView ของ UITableView

self.tableView.backgroundView = self.tableBackgroundImageView;

ดังนั้นฉันจึงลบ UIImageView สำหรับ backgroundView ออกจาก UIView (มุมมองรูท) และรีเซ็ต (ลบ) การอ้างอิงเค้าโครงอัตโนมัติทั้งหมดไปยัง UIImageView นั้น ฉันวาง UIImageView สำหรับพื้นหลังไว้ที่ด้านนอกจาก UIView (มุมมองรูท) จากนั้นกำหนดให้กับ backgroundView ของ UITableView ในโค้ด

แล้วแก้ไข.


0

ฉันได้พบทางออกแล้ว

ในกรณีของฉันฉันสร้างมุมมองของเซลล์ในกระดานเรื่องราว (โดยเปิดใช้งานเค้าโครงอัตโนมัติ) และฉันกำหนดอินเทอร์เฟซ UITableViewCell ที่กำหนดเองใน ViewController ฉันต้องย้ายอินเทอร์เฟซไปที่ ViewController.h


0

ฉันพบปัญหาเดียวกันเมื่อฉันใช้สตอรีบอร์ดเพื่อสร้าง UITableViewCell ที่กำหนดเอง โชคดีที่ฉันพบปัญหาเพราะฉันเอา accessoryView ([UITableViewCell setAccessoryView:]) ไปที่ UIButton ที่ฉันเพิ่มลงในเซลล์

ดังนั้นจึงเกิดขึ้นในโครงการของฉันเมื่อเรียกใช้บน iOS6

สารละลาย

ฉันปล่อยเต้าเสียบระหว่าง accessoryView และปุ่มของฉันซึ่งมีเซลล์ที่กำหนดเอง

ข้อเสนอ

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


0

ปัญหานี้อาจเกิดจากการลืมโทร[super viewDidAppear:]ภายในviewDidAppearแต่ฉันแน่ใจว่าไม่ใช่สาเหตุเดียว


0

ฉันมีปัญหาเดียวกันแน่นอน นี่คือปัญหากับโครงการของฉัน:
เมื่อฉันทำงานกับ Interface Builder เพื่อสร้าง UITableViewCell ที่กำหนดเองฉันลากViewแทนTable View Cellจากบานหน้าต่างรวบรวมวัตถุใน Xcode
เป็นเซลล์ตารางที่กำหนดเอง
หากคุณอยู่ในสถานการณ์เดียวกันนี่คือวิธีแก้ไข:
ลบมุมมองในตัวสร้างอินเทอร์เฟซตรวจสอบให้แน่ใจว่าคุณลากเซลล์มุมมองตารางจากบานหน้าต่างคอลเลกชันวัตถุและทำซ้ำมุมมองเซลล์ตารางแบบกำหนดเอง คุณสามารถคัดลอกวัตถุในมุมมองเก่าและวางลงบนผืนผ้าใบสำหรับเซลล์มุมมองตารางใหม่


0

ฉันมีปัญหาที่คล้ายกันมากกับมุมมองส่วนท้ายของตารางที่ฉันตั้งค่าใน Xcode 6, iOS 7+ วิธีแก้ปัญหาอยู่ในรูปแบบของไฟล์ nib เห็นได้ชัดว่ามันติดอยู่ในรูปแบบ Xcode 4 หรืออะไรสักอย่าง การเปลี่ยนการตั้งค่าไฟล์เป็น "เปิดใน: Xcode 6.0" (หรือค่าเริ่มต้นสำหรับกรณีนั้น) แก้ไขได้ทันที พบวิธีแก้ปัญหาโดยบังเอิญ: มันทำให้ฉันบ้าดังนั้นฉันจึงลบไฟล์ทั้งหมดและสร้างอีกครั้งโดยเห็นได้ชัดว่ามีการตั้งค่าเริ่มต้น ฉันไม่รู้ว่าทำไมการแก้ไขไฟล์ใน Xcode ล่าสุดจึงไม่แปลงเป็นรูปแบบ Xcode 5+ อย่างที่มักจะเกิดขึ้น

ฉ


0

ฉันไปมีปัญหาเดียวกัน ฉันไปที่ DetailViewController และเปลี่ยนชื่อตัวระบุเป็น UIView ก่อนหน้านี้บน UITableView มันแก้ไขปัญหา ปัญหานี้ไม่จำเป็นต้องอยู่ใน DetailViewController ของคุณ อาจเป็นอย่างอื่นก็ได้ ลองเปลี่ยนชื่อเป็นตัวระบุที่เคารพ


0

ฉันมีปัญหาคล้ายกันกับเซลล์มุมมองตารางแบบคงที่ใน IB เซลล์หนึ่งมีมุมมองย่อยที่มีคลาสที่ถูกเปลี่ยนแปลงผิดพลาดเป็นคลาสย่อยของ UITextfield คอมไพเลอร์ไม่ได้ให้คำเตือน / ข้อผิดพลาดใด ๆ แต่ในรันไทม์ระบบไม่สามารถโหลดตัวควบคุมมุมมองได้ด้วยเหตุขัดข้องดังกล่าวข้างต้น



0

วิธีแก้ไข: เปลี่ยนข้อ จำกัด ก่อนเรียกเค้าโครงขั้นสูง

- (void)layoutSubviews
{

    [self _updateConstraints];

    [super layoutSubviews];
}

0

ฉันแก้ไขคำตอบของ Carl Lindbergเพื่อแทนที่UITableViewและมันก็เริ่มทำงานให้ฉัน:

UITableView + AutoLayoutFix.h

@interface UITableView (AutoLayoutFix)
@end

UITableView + AutoLayoutFix.m

#import <objc/runtime.h>

@implementation UITableView (AutoLayoutFix)

+ (void)load
{
    Method existingMethod = class_getInstanceMethod(self, @selector(layoutSubviews));
    Method newMethod = class_getInstanceMethod(self, @selector(_autolayout_replacementLayoutSubviews));

    method_exchangeImplementations(existingMethod, newMethod);
}

- (void)_autolayout_replacementLayoutSubviews
{
    [super layoutSubviews];
    [self _autolayout_replacementLayoutSubviews]; // not recursive due to method swizzling
    [super layoutSubviews];
}

@end

จากนั้นMyViewController.mฉันเพิ่งนำเข้าหมวดหมู่:

#import "UITableView+AutoLayoutFix.h"

0

ผมได้พบกับปัญหาเดียวกันและในที่สุดก็พบว่าเหตุผลคือการที่ฉันเพิ่มอีกหนึ่งข้อ จำกัด กับ UITableViewCell ซึ่งควรจะเป็น UITableViewCell ของcontentView เมื่อฉันเปลี่ยนข้อ จำกัด ทุกอย่างก็เป็นไปด้วยดี!

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