Bố cục tự động của Câm vẫn được yêu cầu sau khi thực hiện -layoutSubview 'với lớp con UITableViewCell


115

Sử dụng XCode 4.5 và iOS 6, tôi đang phát triển một ứng dụng có chế độ xem bảng đơn giản với các ô tùy chỉnh. Tôi đã thực hiện điều này hàng trăm lần trong iOS 5 trở xuống, nhưng vì một số lý do, hệ thống autoLayout mới đang mang đến cho tôi rất nhiều rắc rối.

Tôi thiết lập chế độ xem bảng và ô nguyên mẫu của mình trong IB, thêm các cuộc phỏng vấn và kết nối chúng với tư cách là IBOutlets sau đó thiết lập đại biểu và nguồn dữ liệu của tôi. Tuy nhiên, bây giờ bất cứ khi nào ô đầu tiên được tìm nạp cellForRowAtIndexPath, tôi gặp lỗi sau:

*** Lỗi xác nhận trong - [Bố cục ShopCellSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m giáp776

*** Chấm dứt ứng dụng do ngoại lệ chưa được phát hiện 'NSIternalInconsistencyException', lý do: 'Bố cục tự động vẫn được yêu cầu sau khi thực hiện -layoutSubview. Việc triển khai -layoutSubview của ShopCell cần gọi siêu. '

Tôi đã không triển khai phương thức -layoutSubview trong ô được phân lớp của mình (ShopCell) và ngay cả khi tôi cố gắng thực hiện điều đó và thêm siêu cuộc gọi vì nó cho thấy tôi vẫn gặp lỗi tương tự. Nếu tôi xóa các cuộc phỏng vấn khỏi ô trong IB và thay đổi nó thành UITableViewCell tiêu chuẩn, mọi thứ sẽ hoạt động như mong đợi, mặc dù dĩ nhiên tôi không còn dữ liệu trong các ô của mình.

Tôi gần như chắc chắn rằng có điều gì đó đơn giản tôi đang thiếu, nhưng không thể tìm thấy bất kỳ tài liệu hoặc hướng dẫn nào để đề xuất những gì tôi đã làm sai. Bất kỳ trợ giúp sẽ được đánh giá cao.

Chỉnh sửa: Chỉ cần thử thay đổi nó thành UITableViewCell trong IB và để tất cả các cuộc phỏng vấn tại chỗ, vẫn cùng một lỗi.


Thử lldb [[UIWindow keyWindow] _autoLayoutTrace]tại khu vực gỡ lỗi nếu sử dụng bố trí tự động.
A-Live

3
Bạn có đang sử dụng UIView cho ô tùy chỉnh thay vì UITableViewCell không? Tôi đã từng gặp vấn đề tương tự. Tôi đã có UIView cho ô tùy chỉnh và đã thêm các chế độ xem phụ vào đó. Đã thay đổi thành UITableViewCell và nó đã hoạt động.

Hey mike, làm thế nào bạn xác định các cửa hàng? Chúng có thuộc tính trong tệp thực hiện của bạn trong phần mở rộng lớp không?
kocodude

@ A-Live Bất cứ khi nào tôi thử sử dụng phương thức đó, tôi gặp lỗi trong trình gỡ lỗi .... phương pháp này có còn hiệu lực không? Chỉnh sửa: Nevermind, nó là chữ thường trong tự động thanh toán.
mượn

bỏ chọn hộp autoLayout trong trình kiểm tra sau đó dọn dẹp và chạy. nó chắc chắn sẽ làm việc
Nico

Câu trả lời:


57

Tôi đã gặp vấn đề tương tự trong khi thêm thủ công trong mã. Trong mã, tôi đã làm như sau:

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

Giả thuyết

Từ những gì tôi có thể nói, vấn đề là khi bạn vô hiệu hóa translatesAutoresizingMaskIntoConstraints, UITableViewCell bắt đầu sử dụng Giao diện tự động và tự nhiên thất bại vì việc triển khai cơ bản layoutSublayersForLayerkhông gọi là siêu. Ai đó với Hopper hoặc một số công cụ khác có thể xác nhận điều này. Vì bạn đang sử dụng IB, có lẽ bạn đang tự hỏi tại sao đây lại là một vấn đề ... và đó là vì việc sử dụng IB sẽ tự động vô hiệu hóa translatesAutoresizingMaskIntoConstraintscác chế độ xem mà nó thêm các ràng buộc (nó sẽ tự động thêm một ràng buộc về chiều rộng và chiều cao ở vị trí của chúng).

Giải pháp

Giải pháp của tôi là di chuyển mọi thứ đến contentView.

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

Tôi không chắc chắn 100% nếu điều này sẽ hoạt động trong Trình tạo giao diện, nhưng nếu bạn đẩy mọi thứ ra khỏi ô của mình (giả sử rằng bạn có thứ gì đó trực tiếp trên nó) thì nó sẽ hoạt động. Hy vọng điều này sẽ giúp bạn!


4
Tôi cũng cần phải thêm subview.translatesAutoresizingMaskIntoConstraints = NO'vào mỗi khung nhìn mà tôi đã thêm vào contentView.
Jay Peyer

5
Điều này làm việc cho tôi. Ngoài ra, hãy chắc chắn rằng bạn không gọi self.contentView.translatesAutoresizingMaskIntoConstraints = NOcho UITableViewCell.
Maurizio

53

Rõ ràng, việc triển khai layoutSubview của UITableViewCell không gọi là super, đây là một vấn đề với bố cục tự động. Tôi muốn biết liệu việc thả danh mục dưới đây vào các dự án có sửa được mọi thứ không. Nó đã giúp trong một dự án thử nghiệm.

#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

Tôi có thể thêm vấn đề cho tôi khi sử dụng nềnView trên ô của bảng, vì nó được thêm dưới dạng một khung nhìn vào ô (trong khi hầu hết các cuộc phỏng vấn nên được thêm vào contentView của ô bảng, thường sẽ hoạt động tốt hơn).

Lưu ý: Có vẻ như lỗi này đã được sửa trong iOS7; Tôi đã có thể xóa mã này hoặc ít nhất là thêm kiểm tra thời gian chạy để nó chỉ được thực hiện nếu chạy trên iOS6.


Điều kỳ lạ là nó hoạt động tốt với một UITableViewCell đơn giản đối với tôi, chỉ không dành cho một lớp con ...
borrrden

Bạn sẽ nghĩ vậy, nhưng tất cả những gì tôi có là một phương thức init, không có gì khác> <. Tôi chưa bao giờ ghi đè lên bố cục Các cuộc phỏng vấn trong cuộc sống của tôi haha. Tôi nghĩ vấn đề là quan điểm tùy chỉnh mà UITableViewCell sử dụng như xem gốc của nó không thể sử dụng bố trí tự động bởi vì nó sẽ ghi đè layoutSubviews (vì vậy khi bạn cố gắng thêm trở ngại đến xem gốc, nó sẽ thất bại)
borrrden

6
Tôi đã phải tạo một danh mục UITableViewnhư vậy vì lý do tương tự (iOS 6.1 b1)
Joshua J. McKinnon

5
Có cách khắc phục tương tự cho TableHeaderView khi sự cố vẫn còn tồn tại trong ios 7 không?
Softlion

1
Điều này làm việc tuyệt vời. Tôi đã gặp phải vấn đề này khi tôi cố gắng tập trung vào một khung nhìn phụ UIVIew trong UITableView. Ngay cả trong iOS 7, sự khẳng định đã xảy ra. Nhưng nó không xảy ra trong iOS 8, vì vậy họ phải giải quyết lỗi này.
Jordan H

33

Tôi đã có cùng một lỗi trong vài tháng. Nhưng tôi đã tìm thấy những gì là vấn đề.

Khi tôi tạo một tệp IB, a UIViewđã được thêm vào. Nếu bạn sử dụng chế độ xem này, ứng dụng sẽ không gặp sự cố khi bố trí tự động bị tắt (nhưng có một số vấn đề khác). Khi bạn sử dụng bố cục tự động, bạn phải chọn chế độ xem đúng trong Thư viện đối tượng : UITableViewCell.

Trong thực tế, bạn nên luôn luôn sử dụng mặt hàng này bởi vì tất cả subviews được thêm vào contentViewcủa UITableViewCell.

Đó là tất cả. Tất cả rồi sẽ ổn thôi.


Đây không phải là câu trả lời được chấp nhận vì câu hỏi không phải là về việc triển khai sử dụng IB và bởi vì vấn đề này có thể xảy ra khi bạn không sử dụng IB. Nếu bạn đang thực hiện quan điểm của mình theo lập trình, câu trả lời của @ PhilLoden sẽ khả thi hơn.
Eric

Tôi không hiểu câu trả lời. ai đó có thể giải thích rõ ràng hơn? cảm ơn
hasan

Tôi nghĩ rằng tôi có quyền. Là đủ để kiểm tra lớp att. trong thanh tra danh tính trong xây dựng giao diện? hoặc đã được thêm vào là một loại khác và lớp att. đã được cập nhật sau? Điều đó cũng gây ra vấn đề?
hasan

@ hasan83 Bạn thực sự có thể trả lại tế bào. Một UITableViewCell về cơ bản là một UIView với mã định danh tái sử dụng.
Arnaud

17

Tôi gặp rắc rối tương tự với custom UITableViewHeaderFooterView+ xib.

Tôi đã thấy một số câu trả lời ở đây, nhưng tôi đã tìm thấy cách triển khai -layoutSubviewstrong lớp xem chân trang tùy chỉnh của mình khắc phục sự cố:

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

1
Xin lưu ý rằng điều này có thể dẫn đến vòng lặp vô tận và cuối cùng là EXC_BAD_ACCESS Kern_PROTMENT_FAILURE
mbi

15

Tôi đã thấy điều này là kết quả của việc sửa đổi các ràng buộc trong việc triển khai layoutSubview của tôi. Di chuyển cuộc gọi đến siêu từ đầu đến cuối phương thức đã khắc phục sự cố.


Điều này làm việc cho tôi. Tôi có một UICollectionViewCell tùy chỉnh mà tôi đang định dạng trong layoutSubview. Bất cứ ai cũng biết tại sao giải pháp này hoạt động mặc dù?
STANGMMX

@STANGMMX, câu trả lời của A'sa Dickens giải thích lý do.
Fábio Oliveira

15

Có vấn đề tương tự trong iOS 7 (iOS 8 dường như đã khắc phục). Giải pháp cho tôi là gọi [self.view layoutIfNeeded]vào cuối viewDidLayoutSubviewsphương thức của tôi .


Cảm ơn bạn. Nó giúp tôi. Tôi đã gặp vấn đề này ngày hôm qua (trên iOS 7). nó giúp cho iOS 7.
Alexander

@MaciejSwic xem câu trả lời của tôi ở trên cùng.
Sound Blaster

Điều này làm việc cho tôi! Sử dụng iOS 7.1 với Swift. Tôi đã gỡ bỏ và thêm một ràng buộc trên viewDidLayoutSubview. Tôi đã xóa siêu cuộc gọi và nó vẫn không hoạt động, nhưng giải pháp này đã làm được điều đó! cho con khủng long này một chiếc lá! :)
jomafer 5/03/2015

Tôi cũng làm việc với iOS 7.1!
fdlr

14

Tôi gặp vấn đề tương tự. Vấn đề là ở cách tôi tạo ra tế bào Xib. Tôi đã tạo một Xib như bình thường và chỉ thay đổi loại "UIView" mặc định thành lớp UITableViewCell tùy chỉnh của tôi. Cách chính xác là trước tiên xóa chế độ xem mặc định và sau đó kéo đối tượng ô xem bảng vào xib. Thêm chi tiết tại đây: http://allplayers.github.io/blog/2012/11/18/Custom-UITableViewCell-With-NIB/


1
Cái nhìn sâu sắc hoàn hảo! Tôi sẽ mất nhiều thời gian để nhận ra điều đó, đặc biệt vì các ứng dụng của tôi sẽ không gặp sự cố nếu tôi sử dụng UIView với AutoLayout bị tắt.
Guilherme

Siêu! xem thêm @Arnaud respone dưới đây
Lubbo

7

Tôi đã giải quyết vấn đề bằng cách tắt "Tự động xóa" cho tất cả các lần xem xét của Ô xem bảng tùy chỉnh của tôi.

Trong xib cho một ô tùy chỉnh, chọn một khung nhìn phụ và bỏ chọn Trình kiểm tra tệp> Tài liệu trình tạo giao diện> Sử dụng Tự động xóa


4
Tôi làm giống vậy. Mặc dù không thực sự là một giải pháp nếu bạn muốn sử dụng tính năng tự động thanh toán
ajmccall

7

Tôi đã có một vấn đề tương tự không phải trên UITableViewCellmà là trên UITableViewchính nó. Bởi vì đó là kết quả đầu tiên trong Google tôi sẽ đăng nó ở đây. Hóa ra đó viewForHeaderInSectionlà vấn đề. Tôi đã tạo UITableViewHeaderFooterViewvà thiết lập translatesAutoresizingMaskIntoConstraintsthành NO. Bây giờ đến phần thú vị:

IOS 7:

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

Nếu tôi làm điều này, ứng dụng gặp sự cố với

Giao diện tự động vẫn được yêu cầu sau khi thực hiện -layoutSubview. Việc triển khai -layoutSubview của UITableView cần gọi siêu.

OK, tôi nghĩ rằng bạn không thể sử dụng bố cục tự động trên tiêu đề xem bảng và chỉ trên các cuộc phỏng vấn. Nhưng đó không phải là sự thật đầy đủ như bạn thấy sau này. Tóm lại: Không tắt mặt nạ tự động thay đổi kích thước cho tiêu đề trên iOS 7. Nếu không, nó hoạt động tốt.

iOS 8:

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

Nếu tôi không sử dụng điều này, tôi sẽ nhận được đầu ra sau:

Không thể đồng thời thỏa mãn các ràng buộc.

Đối với iOS 8, bạn phải tắt mặt nạ tự động thay đổi kích thước cho tiêu đề.

Không biết tại sao nó hoạt động theo cách này nhưng có vẻ như Apple đã sửa một số thứ trong iOS 8 và bố cục tự động hoạt động khác nhau trên iOS 7 và iOS 8.


Mate bạn chỉ tiết kiệm trong ngày của tôi!
Marcin Małysz

5

Như ai đó đã nói ở trên, khi bạn tạo chế độ xem để sử dụng trong UITableView, bạn phải xóa chế độ xem được tạo theo mặc định và kéo UITableViewCell hoặc UITableViewHeaderFooterView làm chế độ xem gốc. Tuy nhiên, có một cách để sửa XIB trong trường hợp bạn đã bỏ lỡ phần đó. Bạn phải mở tệp XIB trong trình soạn thảo văn bản và trong thẻ gốc và con trực tiếp của nó thêm / thay đổi thuộc tính translatesAutoresizingMaskIntoConstraintsthành YES, ví dụ

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


2

Tôi gặp phải điều này và có vẻ như nó có liên quan đến các lớp con UITableViewCell như các ô nguyên mẫu đặc biệt có các lớp con UIView tùy chỉnh khác được thêm vào chúng. Tôi nhấn mạnh 'tùy chỉnh' ở đây vì tôi đã thành công với các tế bào chỉ có con UIKit, nhưng nó bị đổ khi cố gắng xây dựng các ràng buộc cho các chế độ xem mà tôi đã tạo ra, đặt ra lỗi trong câu hỏi của tác giả.

Tôi đã phải tách các tế bào của mình thành các ngòi độc lập không sử dụng AutoLayout.

Hãy hy vọng Apple dọn dẹp mớ hỗn độn này.


2

Thêm các cuộc phỏng vấn của bạn vào nội dung Xem của ô thay vì chính ô đó. Vì vậy, thay vì:

[self addSubview:someView];

bạn phải dùng

[self.contentView addSubview:someView];


1

Tôi gặp phải điều này vì ban đầu tôi đã thêm một UIView thay vì UITableViewCell vào tệp xib.


1

Tôi đã loại bỏ lỗi này bằng cách hủy backgroundViewkết nối trình kết nối khỏi nền UIImageViewvà trình accessoryViewkết nối khỏi các UIButtontùy chỉnh của tôi . Tôi nghi ngờ rằng những thứ này không có nghĩa là được sử dụng theo cách tôi đang sử dụng chúng.


1

Tôi đã gặp vấn đề này lần đầu tiên ngày hôm nay. Cho đến bây giờ tôi đã có một số kinh nghiệm khác nhau trong việc sử dụng các lớp con UITableViewCell nguyên mẫu nhưng chưa bao giờ gặp phải vấn đề này. Điều khác biệt về tế bào tôi đang làm việc là tôi đã có một IBOutlet cho -backgroundView mà tôi đang sử dụng để tô màu cho tế bào. Tôi thấy rằng nếu tôi tạo một thuộc tính mới và vẫn thêm một UIView mới kéo dài nhịp của toàn bộ ô, thì xác nhận này đã biến mất. Để xác minh đây là nguyên nhân, tôi đã quay lại gắn chế độ xem này vào ổ cắm nền và xem xác nhận lại. Cho đến nay, không có vấn đề nào khác khi sử dụng AutoLayout trong nguyên mẫu được phân lớp UITableViewCell kể từ khi tôi thực hiện thay đổi này.


1

Tôi không nhận được bất kỳ giải pháp thích hợp nào cho vấn đề này nhưng bạn có thể khắc phục bằng cách sử dụng khung và không đặt thuộc tính translatesAutoresizingMaskIntoConstraint thành Không (theo mặc định là có, vì vậy đừng đặt nó)

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

Tôi đã trải qua điều tương tự. Hóa ra nếu bạn lập trình thêm một khung nhìn phụ từ ShopCell .xib / Storyboard của bạn, sử dụng bố cục tự động, như một khung nhìn cho một khung nhìn khác, ngoại lệ đó có thể được ném, tùy thuộc vào cách các ràng buộc của bạn được định cấu hình. Tôi đoán là các ràng buộc được tạo trong IB là điều tạo ra những rắc rối khi lập trình thêm một khung nhìn dưới dạng một khung nhìn, vì sau đó nó duy trì các ràng buộc từ viewA -> viewB trong khi đó bạn có thể thêm viewB làm một khung nhìn phụ của viewC. Bạn hiểu rồi (câu đó thậm chí còn gây nhầm lẫn cho bản thân)?

Trong tình huống của tôi - vì các chế độ xem rất đơn giản đã gây ra sự cố - tôi đã tạo các chế độ xem theo chương trình và không có trong IB. Điều đó đã giải quyết nó. Bạn có thể trích xuất các chế độ xem đó sang các tệp xib khác và tắt bố cục tự động cho các chế độ xem đó. Tôi đoán điều đó sẽ làm việc.


0

Trong một số tình huống, điều này giải quyết vấn đề bố trí dễ dàng (tùy thuộc vào bố cục của bạn). Bên trong lớp con UITableView của bạn, trong awakeFromNib hoặc init, đặt mặt nạ tự động hóa:

self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Bằng cách tự động, nó được đặt thành UIViewAutoresizingNone


Điều này đã giải quyết vấn đề tôi đang phải đối mặt. Tôi đang sử dụng bố trí tự động trong một ô của bảng kết hợp với [tableViewCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].heightđể lấy chiều cao, sau đó tôi sử dụng heightForRowAtIndexPath.
NathanAldenSr

0

Trong trường hợp của tôi,

UIImageView được tham chiếu cho bố cục tự động cho UITableView được gán cho backgroundView của UITableView.

self.tableView.backgroundView = self.tableBackgroundImageView;

Vì vậy, tôi đã xóa UIImageView cho backgroundView khỏi UIView (Chế độ xem gốc) và đặt lại (xóa) tất cả tham chiếu bố cục tự động cho UIImageView đó. Tôi đã đặt UIImageView cho nền ở bên ngoài từ UIView (chế độ xem gốc). Và sau đó gán cho nềnView của UITableView trong mã.

Sau đó cố định.


0

Tôi đã tìm được giải pháp.

Trong trường hợp của tôi, tôi đã tạo chế độ xem của ô trong bảng phân cảnh (có bật bố trí tự động) và tôi đã xác định giao diện UITableViewCell tùy chỉnh trong ViewContoder.m của mình, tôi phải chuyển giao diện sang ViewContoder.h.


0

Tôi gặp phải vấn đề tương tự khi tôi sử dụng bảng phân cảnh để tạo UITableViewCell tùy chỉnh. May mắn thay, tôi đã tìm thấy sự cố, vì tôi đưa phụ kiệnView ([UITableViewCell setAccessoryView:]) sang UIButton mà tôi đã thêm vào ô.

Vì vậy, nó đã xảy ra trong dự án của tôi khi chạy trên iOS6.

Giải pháp

Tôi giải phóng ổ cắm giữa phụ kiện Xem và nút của tôi có chứa ô tùy chỉnh.

Đề nghị

Bạn không nên sử dụng các phần tử gốc của UITableViewCell và thay đổi nó.


0

Vấn đề này có thể được gây ra bằng cách quên cuộc gọi [super viewDidAppear:]bên trong viewDidAppear, nhưng tôi chắc chắn đó không phải là nguyên nhân duy nhất.


0

Tôi đã có chính xác cùng một vấn đề. Đây là vấn đề với dự án của tôi:
Khi tôi làm việc trên Trình tạo giao diện để tạo UITableViewCell tùy chỉnh, tôi đã kéo Chế độ xem thay vì Ô xem bảng từ ngăn bộ sưu tập đối tượng trong Xcode
làm ô bảng tùy chỉnh.
Nếu bạn ở trong tình huống tương tự, đây là giải pháp:
Xóa chế độ xem trong trình tạo giao diện, đảm bảo bạn kéo một ô xem bảng từ ngăn bộ sưu tập đối tượng và làm lại chế độ xem ô của bảng tùy chỉnh. Bạn có thể sao chép các đối tượng trong chế độ xem cũ và dán chúng vào khung vẽ cho Ô xem bảng mới.


0

Tôi gặp vấn đề rất giống với chế độ xem chân trang mà tôi đã đặt trong Xcode 6, iOS 7+. Giải pháp là ở định dạng của tệp nib. Rõ ràng nó đã bị kẹt ở định dạng Xcode 4 hoặc một cái gì đó. Thay đổi cài đặt tệp thành "mở trong: Xcode 6.0" (hoặc Mặc định, đối với vấn đề đó), ngay lập tức đã sửa nó. Tìm thấy giải pháp một cách tình cờ: nó làm tôi phát điên, vì vậy tôi đã xóa toàn bộ tệp và tạo lại, rõ ràng là với các cài đặt mặc định. Tôi không biết tại sao chỉ đơn giản là chỉnh sửa tệp trong Xcode mới nhất đã không chuyển đổi nó thành định dạng Xcode 5+, như thường xảy ra.

f


0

Tôi đã đi có cùng một vấn đề. Tôi đã đi đến Chi tiết Xem của tôi và đổi tên định danh thành UIView. Nó đã từng có trên UITableView. Nó đã khắc phục vấn đề. Vấn đề này không phải nằm trong Chi tiết của bạn. Nó có thể ở bất kỳ ai khác. Hãy thử đổi tên nó thành định danh được tôn trọng.


0

Tôi đã có một vấn đề tương tự với các ô xem bảng tĩnh trong IB. Một trong các ô có một khung nhìn con có một lớp bị thay đổi nhầm thành một lớp con của UITextfield. Trình biên dịch không đưa ra bất kỳ cảnh báo / lỗi nào. Nhưng trong thời gian chạy, hệ thống không thể tải bộ điều khiển xem với sự cố đã nói ở trên.



0

Giải pháp: thay đổi các ràng buộc trước khi gọi super layoutSubview

- (void)layoutSubviews
{

    [self _updateConstraints];

    [super layoutSubviews];
}

0

Thay vào đó, tôi đã sửa đổi câu trả lời của Carl Lindberg để ghi đè UITableViewvà nó bắt đầu hoạt động với tôi:

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

Sau đó, trong MyViewController.mtôi chỉ cần nhập danh mục:

#import "UITableView+AutoLayoutFix.h"

0

Tôi đã gặp cùng một vấn đề và cuối cùng tìm thấy lý do là tôi thêm một hạn chế đối với các UITableViewCell, mà nên là của UITableViewCell contentView . Khi tôi thay đổi các ràng buộc, mọi thứ đều ổn!

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.