断言失败——[UITableView layoutSublayersOfLayer:]在ios7上。

时间:2022-10-22 15:30:37

Here's the issue: UITableViewController (with UITableView) and when there's no row, I would like to show a "No content" label above.

这里有一个问题:UITableViewController(使用UITableView),当没有行时,我想显示上面的“无内容”标签。

It works on iOS 8.x but crashes (assertion failure) on iOS 7.1.

它适用于iOS 8。但在ios7.1上崩溃(断言失败)。

Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794

断言失败在-[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.'

终止应用程序由于未被捕获的异常“nsinternalinencyexception”,原因:在执行-layoutSubviews后仍然需要自动布局。UITableView的-layoutSubviews的实现需要调用super。

Full stack:

完整的堆栈:

*** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.'
*** First throw call stack:
(
    0   CoreFoundation                      0x007fb1e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x0057a8e5 objc_exception_throw + 44
    2   CoreFoundation                      0x007fb048 +[NSException raise:format:arguments:] + 136
    3   Foundation                          0x0015a4de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
    4   UIKit                               0x00cdea38 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 567
    5   libobjc.A.dylib                     0x0058c82b -[NSObject performSelector:withObject:] + 70
    6   QuartzCore                          0x044eb45a -[CALayer layoutSublayers] + 148
    7   QuartzCore                          0x044df244 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    8   QuartzCore                          0x044eb3a5 -[CALayer layoutIfNeeded] + 160
    9   UIKit                               0x00da0ae3 -[UIViewController window:setupWithInterfaceOrientation:] + 304
    10  UIKit                               0x00cb6aa7 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 5212
    11  UIKit                               0x00cb5646 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 82
    12  UIKit                               0x00cb5518 -[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:] + 117
    13  UIKit                               0x00cb55a0 -[UIWindow _setRotatableViewOrientation:duration:force:] + 67
    14  UIKit                               0x00cb463a __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke + 120
    15  UIKit                               0x00cb459c -[UIWindow _updateToInterfaceOrientation:duration:force:] + 400
    16  UIKit                               0x00cb52f3 -[UIWindow setAutorotates:forceUpdateInterfaceOrientation:] + 870
    17  UIKit                               0x00cb88e6 -[UIWindow setDelegate:] + 449
    18  UIKit                               0x00d92b77 -[UIViewController _tryBecomeRootViewControllerInWindow:] + 180
    19  UIKit                               0x00cae474 -[UIWindow addRootViewControllerViewIfPossible] + 591
    20  UIKit                               0x00cae5ef -[UIWindow _setHidden:forced:] + 312
    21  UIKit                               0x00cae86b -[UIWindow _orderFrontWithoutMakingKey] + 49
    22  UIKit                               0x00cb93c8 -[UIWindow makeKeyAndVisible] + 65
    23  tableviewtest                       0x000eea0a -[AppDelegate application:didFinishLaunchingWithOptions:] + 554
    24  UIKit                               0x00c6914f -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 309
    25  UIKit                               0x00c69aa1 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1810
    26  UIKit                               0x00c6e667 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
    27  UIKit                               0x00c82f92 -[UIApplication handleEvent:withNewEvent:] + 3517
    28  UIKit                               0x00c83555 -[UIApplication sendEvent:] + 85
    29  UIKit                               0x00c70250 _UIApplicationHandleEvent + 683
    30  GraphicsServices                    0x02cc7f02 _PurpleEventCallback + 776
    31  GraphicsServices                    0x02cc7a0d PurpleEventCallback + 46
    32  CoreFoundation                      0x00776ca5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
    33  CoreFoundation                      0x007769db __CFRunLoopDoSource1 + 523
    34  CoreFoundation                      0x007a168c __CFRunLoopRun + 2156
    35  CoreFoundation                      0x007a09d3 CFRunLoopRunSpecific + 467
    36  CoreFoundation                      0x007a07eb CFRunLoopRunInMode + 123
    37  UIKit                               0x00c6dd9c -[UIApplication _run] + 840
    38  UIKit                               0x00c6ff9b UIApplicationMain + 1225
    39  tableviewtest                       0x000eed4a main + 138
    40  libdyld.dylib                       0x028fa6d9 start + 1
    41  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

I made an example project where I don't use storyboard or nibs. (No Main.storyboard and removed the entry in Info.plist)

我做了一个示例项目,我不使用故事板或nib。(无主。故事板,并移除Info.plist中的条目。

Source code:

源代码:

AppDelegate.h

AppDelegate.h

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;


@end

AppDelegate.m

AppDelegate.m

#import "AppDelegate.h"
#import "ViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ViewController *viewController = [[ViewController alloc] init];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [self.window setRootViewController:viewController];
    [self.window makeKeyAndVisible];

    return YES;
}

ViewController.h

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UITableViewController


@end

ViewController.m

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    UILabel *centerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    centerLabel.translatesAutoresizingMaskIntoConstraints = NO;
    centerLabel.backgroundColor = [UIColor grayColor];
    centerLabel.text = @"Hello World 42";
    [self.view addSubview:centerLabel];

    NSDictionary *subviews = NSDictionaryOfVariableBindings(centerLabel);
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[centerLabel(160)]"
                                                                        options:0
                                                                        metrics:nil
                                                                          views:subviews]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[centerLabel(60)]"
                                                                        options:0
                                                                        metrics:nil
                                                                          views:subviews]];
}

@end

Read this report and refactored my code to use MyTableView instance for the UITableViewController:

读取这个报告并重构我的代码以使用UITableViewController的MyTableView实例:

MyTableView.h

MyTableView.h

#import <UIKit/UIKit.h>

@interface MyTableView : UITableView

@end

MyTableView.m

MyTableView.m

#import "MyTableView.h"

@implementation MyTableView

- (void)layoutSublayersOfLayer:(CALayer *)layer
{
    NSLog(@"layoutSublayersOfLayer:\n%@", [self performSelector:@selector(_autolayoutTrace) withObject:nil]); // compiler warning - ignore for this time
    [super layoutSublayersOfLayer:layer];
}

@end

And overrode -UITableViewController loadView method like this:

重载-UITableViewController loadView方法:

- (void)loadView
{
    MyTableView *tableView = [[MyTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];

    self.view = tableView;
    self.tableView = tableView;
}

Here's the result under iOS 8.x:

这是iOS 8下的结果:

2015-07-10 13:04:41.987 tableviewtest[55866:13452767] layoutSublayersOfLayer:

UIWindow:0x7e06fa00
|   •MyTableView:0x7db5ac00
|   |   UITableViewWrapperView:0x7db47200
|   |   *UILabel:0x7bcdb3f0'Hello World 42'- AMBIGUOUS LAYOUT for UILabel:0x7bcdb3f0'Hello World 42'.minX{id: 3}, UILabel:0x7bcdb3f0'Hello World 42'.minY{id: 8}
|   |   UIImageView:0x7bceab00
|   |   UIImageView:0x7bceb9a0
2015-07-10 13:04:41.988 tableviewtest[55866:13452767] layoutSublayersOfLayer:

UIWindow:0x7e06fa00
|   •MyTableView:0x7db5ac00
|   |   UITableViewWrapperView:0x7db47200
|   |   *UILabel:0x7bcdb3f0'Hello World 42'
|   |   UIImageView:0x7bceab00
|   |   UIImageView:0x7bceb9a0

断言失败——[UITableView layoutSublayersOfLayer:]在ios7上。

Here's the result under iOS 7.1:

这是iOS 7.1下的结果:

2015-07-10 13:02:47.912 tableviewtest[55803:607] layoutSublayersOfLayer:

*<UIWindow:0x7ae63e70>
|   *<MyTableView:0x7c221000>
|   |   <UITableViewWrapperView:0x7b048610>
|   |   *<UILabel:0x7b046f20>
|   |   <UIImageView:0x7b076280>
|   |   <UIImageView:0x7b079c00>
2015-07-10 13:06:27.886 tableviewtest[55911:607] *** Assertion failure in -[MyTableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794
2015-07-10 13:06:27.889 tableviewtest[55911:607] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. MyTableView's implementation of -layoutSubviews needs to call super.'
...

Based on this report I also tried to set

在这份报告的基础上,我也尝试了设置。

centerLabel.translatesAutoresizingMaskIntoConstraints = YES;

but in that case I have no visible label (because of a conflict and there's no contentView of UITableViewController like on a UITableViewCell).

但在这种情况下,我没有可见的标签(因为有冲突,而且UITableViewCell上没有UITableViewController的contentView)。

Does anybody have a solution for this issue?

有人能解决这个问题吗?

Thank you,

谢谢你!

Adam

亚当

P.S.: Sorry for the long post

注:很抱歉这么长的帖子。

1 个解决方案

#1


4  

in iOS7, table view could not add a subview. A view of the tableViewController is the table view

在iOS7中,表视图不能添加子视图。tableViewController的视图是表视图。

#1


4  

in iOS7, table view could not add a subview. A view of the tableViewController is the table view

在iOS7中,表视图不能添加子视图。tableViewController的视图是表视图。