2015-07-10 99 views
0

這裏的問題:的UITableViewController(帶的UITableView),當沒有排,我想上面顯示「無內容」標籤。斷言失敗 - [UITableView的layoutSublayersOfLayer:]在iOS 7

在iOS 7.1在iOS 8.x的但崩潰(斷言失敗)工作。在

斷言故障 - [UITableView的layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794

終止應用程序由於未捕獲的異常 'NSInternalInconsistencyException',原因:「自動在執行-layoutSubviews之後,佈局仍然需要 。 UITableView的實現 -layoutSubviews需要調用super。'

完整的堆棧:

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

我做出了表率項目,我不使用故事板或筆尖。 (無Main.storyboard和除去的Info.plist條目)

源代碼:

AppDelegate.h

#import <UIKit/UIKit.h> 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 

@property (strong, nonatomic) UIWindow *window; 


@end 

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

#import <UIKit/UIKit.h> 

@interface ViewController : UITableViewController 


@end 

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 

閱讀this report和重構我的代碼使用MyTableView實例爲的UITableViewController:

MyTableView.h

#import <UIKit/UIKit.h> 

@interface MyTableView : UITableView 

@end 

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 

而且凌駕於-UITableViewController的loadView方法是這樣的:

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

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

這裏下的iOS 8.x的結果:

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 

Visual result under 8.x

這裏的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.' 
... 

基於this report我也試着設置

centerLabel.translatesAutoresizingMaskIntoConstraints = YES; 

但在這種情況下,我沒有明顯的標籤(因爲有衝突,有沒有的UITableViewController的內容查看就像一個UITableViewCell)。

有沒有人有這個問題的解決方案?

謝謝

亞當

P.S:很抱歉的長期職位

+0

可能是這個[link](http://stackoverflow.com/questions/24549334/autolayout-crash-when-applying-transform-assertion-failure-in-layoutsublayers)幫助你 –

+0

@Adam Szabo,看起來你有幾個問題,你想解決哪一個問題? –

+0

@ Anbu.Karthik試圖將所有centerLabel設置+約束移動到viewWillAppear:&viewDidAppear:以及得到相同的斷言失敗。 –

回答

4

在iOS7,表視圖無法添加子視圖。 tableViewController的視圖是表視圖