所以我有一些 UIViewControllers 我已经子类化了我试图用 nib 文件作为视图实例化。问题是,一旦我实例化它们,它们上的视图属性就会引发EXC_BAD_ACCESS
错误并使应用程序崩溃。
这就是我正在做的事情:
KMLFTPConnectionEditViewController.h
#import <UIKit/UIKit.h>
@interface KMLFTPConnectionEditViewController : UIViewController
@end
KMLFTPConnectionEditViewController.m
#import "KMLFTPConnectionEditViewController.h"
@interface KMLFTPConnectionEditViewController ()
@end
@implementation KMLFTPConnectionEditViewController
- (id)init
{
self = [super initWithNibName:@"KMLFTPConnectionEditView" bundle:nil];
if ( self ) {
}
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
return [self init];
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
@end
别处
KMLFTPConnectionEditViewController * ftpvc = [[KMLFTPConnectionEditViewController alloc] init];
NSLog(@"View: %@", ftpvc.view); // <- crash!
现在,至于笔尖,它被称为KMLFTPConnectionEditView.xib
,它满足我认为它需要的所有要求,据我从其他 SO 帖子以及 Apple 自己的文档中可以看出:
- 其文件的所有者类设置为
KMLFTPConnectionEditViewController
- 其文件所有者的视图出口连接到 nib 中的主视图。
- nib 存在于项目中,并且包含在主应用程序包中。
这也是我用笔尖设置的另一个 UIViewController 子类的情况。
今天早上这对我有用,但我必须做出改变(今天有一个 XCode 更新......)我只是没有看到。我已经为此奋斗了几个小时,但无济于事。
我在这里忽略了一些简单的事情吗?
更新 1
在这里发布内联太大了,但根据下面 Aaron 的要求,这里是崩溃日志。看起来我设置的 UITextField 外观代理正在递归某些东西。有任何想法吗?
更新 2
如果我从尝试加载的笔尖中删除 UITextFields,则没有问题。一旦我将任何 UITextInput 视图放回笔尖,即使它们没有连接到任何插座或以任何方式设置,我也会遇到这种递归崩溃。
由于外观代理和 UITextField 似乎发生了一些事情,这是我在 AppDelegate 中设置的用于定义外观的方法。请注意,任何非标准颜色都已在导入 AppDelegate 的 UIColor+AppStyles 类别中定义。
- (void)customizeAppearance
{
// Customize the navigation bar appearance
UIImage *navbarBackgroundImage = [[UIImage imageNamed:@"background-navbar.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UINavigationBar appearance] setBackgroundImage:navbarBackgroundImage forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setTitleTextAttributes:
[NSDictionary dictionaryWithObjectsAndKeys:
[UIColor primaryTextColor], UITextAttributeTextColor,
[UIColor primaryTextShadowColor], UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(0, -1)], UITextAttributeTextShadowOffset,
[UIFont titleHeaderFont], UITextAttributeFont,
nil
]
];
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:1 forBarMetrics:UIBarMetricsDefault];
// And the toolbar buttons
UIOffset buttonTextOffset = UIOffsetMake(0, 2);
UIImage *navbarButtonImage = [[UIImage imageNamed:@"background-navbar-button"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 2, 0, 2)];
UIImage *navbarBackButton = [[UIImage imageNamed:@"background-navbar-back-button"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 2)];
NSDictionary *buttonTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor invertedTextColor], UITextAttributeTextColor,
[UIColor invertedTextShadowColor], UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(0, 1)], UITextAttributeTextShadowOffset,
[UIFont buttonFontSmall], UITextAttributeFont,
nil
];
// Text styles
[[UIBarButtonItem appearance] setTitleTextAttributes:buttonTextAttributes forState:UIControlStateNormal];
// Normal bar buttons
[[UIBarButtonItem appearance] setBackgroundImage:navbarButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setTitlePositionAdjustment:buttonTextOffset forBarMetrics:UIBarMetricsDefault];
// Back button
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:navbarBackButton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:buttonTextOffset forBarMetrics:UIBarMetricsDefault];
// And now for the tab bar
UIImage *toolbarBackgroundImage = [[UIImage imageNamed:@"background-toolbar.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIToolbar appearance] setBackgroundImage:toolbarBackgroundImage forToolbarPosition:UIToolbarPositionBottom barMetrics:UIBarMetricsDefault];
// Text Inputs
[[UITextField appearance] setBorderStyle:UITextBorderStyleNone];
[[UITextField appearance] setBackgroundColor:[UIColor clearColor]];
[[UITextField appearance] setFont:[UIFont textInputFont]];
[[UITextField appearance] setTextColor:[UIColor invertedTextColor]];
[[UITextField appearance] setTextAlignment:NSTextAlignmentRight];
// And labels
[[UILabel appearance] setFont:[UIFont formLabelFont]];
[[UILabel appearance] setTextColor:[UIColor invertedTextColor]];
[[KMLSectionHeaderLabel appearance] setFont:[UIFont titleHeaderFont]];
[[KMLSectionHeaderLabel appearance] setBackgroundColor:[UIColor sectionHeaderBackgroundColor]];
}
更新 3
因此,我将其缩小到导致崩溃的外观代理方法中的一行代码:
[[UITextField appearance] setBackgroundColor:[UIColor clearColor]];
如果我对此发表评论,一切都很好。似乎我什至不需要它来做我想做的事情,但是关于为什么这会导致递归和崩溃的任何想法?更令人费解的是,为什么昨天早上还可以正常工作?我没有对外观代理代码的那部分进行任何更改(不过,我已经调整了这些UILabel
位并添加了这些KMLSectionHeaderLabel
位)。我想了解这里发生了什么。