0

所以我有一些 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 自己的文档中可以看出:

  1. 其文件的所有者类设置为KMLFTPConnectionEditViewController
  2. 其文件所有者的视图出口连接到 nib 中的主视图。
  3. 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位)。我想了解这里发生了什么。

4

0 回答 0