[[NSBundle mainBundle] loadNibnamed:owner:options:] 崩溃

发布于 2024-10-27 12:21:50 字数 5297 浏览 1 评论 0原文

我无法弄清楚这一点。我在 IB 中创建了一个自定义 UITableViewCell。据我所知,我拥有单元格中的所有对象,这些对象都是正确连接的 UILabels,并且所有内容都构建没有任何错误。当我尝试使用自定义单元格时,应用程序会在我尝试加载 NIB 时停止。我在下面列出了我为此所做的准备。

任何帮助或提示或在哪里寻找解决这个问题的方法将不胜感激。

谢谢,

John

这是我的 UITableViewCell 接口和实现方法。我不确定我是否真的需要分配 init 标签。我尝试了两种方法...

//  ArrivalTimesCell.h

#import <UIKit/UIKit.h>

@interface ArrivalTimesCell : UITableViewCell {
    IBOutlet UILabel *cityArrivalTimeLabel;
    IBOutlet UILabel *optimumArrivalTimeLabel;
    IBOutlet UILabel *arrivalAvoidTimesLabel;
    IBOutlet UILabel *arrivalTimeNotSetLabel;

}
@property (nonatomic, retain)IBOutlet UILabel *cityArrivalTimeLabel;
@property (nonatomic, retain)IBOutlet UILabel *optimumArrivalTimeLabel;
@property (nonatomic, retain)IBOutlet UILabel *arrivalAvoidTimesLabel;
@property (nonatomic, retain)IBOutlet UILabel *arrivalTimeNotSetLabel;

@end

//  ArrivalTimesCell.m

#import "ArrivalTimesCell.h"

@implementation ArrivalTimesCell
@synthesize arrivalTimeNotSetLabel, arrivalAvoidTimesLabel, optimumArrivalTimeLabel, cityArrivalTimeLabel;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        arrivalTimeNotSetLabel = [[UILabel alloc] init];
        arrivalAvoidTimesLabel = [[UILabel alloc] init];
        optimumArrivalTimeLabel = [[UILabel alloc] init];
        cityArrivalTimeLabel = [[UILabel alloc] init];
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated{
    [super setSelected:selected animated:animated];

}

- (void)dealloc{
    [super dealloc];
    [arrivalTimeNotSetLabel release];
    arrivalTimeNotSetLabel = nil;
    [arrivalAvoidTimesLabel release];
    arrivalAvoidTimesLabel = nil;
    [optimumArrivalTimeLabel release];
    optimumArrivalTimeLabel = nil;
    [cityArrivalTimeLabel release];
    cityArrivalTimeLabel = nil;
}

@end

这是 UITableView 程序执行的 cellForRowAtIndexPath 的一部分

//  TripEditViewController.m

#import "ArrivalTimesCell.h"

@implementation TripEditViewController

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    CellIdentifier = @"ArrivalTimesCell";
    ArrivalTimesCell *cell = (ArrivalTimesCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil){
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ArrivalTimesCell" owner:nil options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = (ArrivalTimesCell *) currentObject;
                break;
             }
         }      
    }


    cell.cityArrivalTimeLabel.text = @"Whatever"
    cell.arrivalAvoidTimesLabel.text = @"Whatever";
    cell.optimumArrivalTimeLabel.text = @"Whatever";
    cell.arrivalTimeNotSetLabel.text = @"Whatever";

    return cell;  
}

在 loadNibNamed 行上停止,控制台中没有任何注释。如果我“步入”,我会得到以下信息,我不确定这与我的崩溃原因有什么关系,而是笔尖未正确加载的结果......

2011-03-29 12:18:14.137 JetLogger[4565:207] * 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[ setValue:forUndefinedKey:]:此类不是键值编码-符合主要城市到达时间标签。 *第一次抛出时的调用堆栈: ( 0 CoreFoundation 0x0111a5a9 异常预处理 + 185 1 libobjc.A.dylib 0x0126e313 objc_异常_抛出 + 44 2 CoreFoundation 0x0111a4e1 -[NSException 引发] + 17 3 基础 0x000ca677 _NSSetUsingKeyValueSetter + 135 4 基础 0x000ca5e5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 285 5 UIKit 0x0054e30c -[UIRuntimeOutletConnection 连接] + 112 6 CoreFoundation 0x010908cf - [NSArray makeObjectsPerformSelector:] + 239 7 UIKit 0x0054cd23 -[UINib instantiateWithOwner:选项:] + 1041 8 UIKit 0x0054eab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:所有者:选项:] + 168 9 JetLogger 0x0004bf18 -[TripEditViewController tableView:cellForRowAtIndexPath:] + 699 10 UIKit 0x003c7b98 - [UITableView(UITableViewInternal)_createPreparedCellForGlobalRow:withIndexPath:] + 634 11 UIKit 0x003bd4cc - [UITableView(UITableViewInternal)_createPreparedCellForGlobalRow:] + 75 12 UIKit 0x003d28cc - [UITableView(_UITableViewPrivate)_updateVisibleCellsNow:] + 1561 13 UIKit 0x003ca90c - [UITableView布局子视图] + 242 14 QuartzCore 0x02051a5a -[CALayer布局子层] + 181 15 QuartzCore 0x02053ddc CALayerLayoutIfNeeded + 220 16 QuartzCore 0x01ff90b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 17 QuartzCore 0x01ffa294 _ZN2CA11Transaction6commitEv + 292 18 QuartzCore 0x01ffa46d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 19 CoreFoundation 0x010fb89b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 27 20 核心基础 0x010906e7 __CFRunLoopDoObservers + 295 21 核心基础 0x010591d7 __CFRunLoopRun + 1575 22 核心基础 0x01058840 CFRunLoopRunSpecific + 208 23 核心基础 0x01058761 CFRunLoopRunInMode + 97 24 图形服务 0x01a081c4 GSEventRunModal + 217 25 图形服务 0x01a08289 GSEventRun + 115 26 UIKit 0x00360c93 UIApplicationMain + 1160 27 JetLogger 0x00001ba8 主 + 102 28 JetLogger 0x00001b39 开始 + 53 ) 抛出“NSException”实例后调用终止

I cannot figure this one out. I have a created a custom UITableViewCell in IB. As far as I can tell I have all the objects in the cell which are all UILabels wired up properly and everything builds without any errors. When I try to use the custom cell the app stops when I try to load the NIB. I've listed what I have in place for this below.

Any help or hints or where to look to figure this one out would be appreciated.

Thanks,

John

Here are my UITableViewCell interface and implementation methods. I am not sure I really needed to alloc init the labels. I tried it both ways...

//  ArrivalTimesCell.h

#import <UIKit/UIKit.h>

@interface ArrivalTimesCell : UITableViewCell {
    IBOutlet UILabel *cityArrivalTimeLabel;
    IBOutlet UILabel *optimumArrivalTimeLabel;
    IBOutlet UILabel *arrivalAvoidTimesLabel;
    IBOutlet UILabel *arrivalTimeNotSetLabel;

}
@property (nonatomic, retain)IBOutlet UILabel *cityArrivalTimeLabel;
@property (nonatomic, retain)IBOutlet UILabel *optimumArrivalTimeLabel;
@property (nonatomic, retain)IBOutlet UILabel *arrivalAvoidTimesLabel;
@property (nonatomic, retain)IBOutlet UILabel *arrivalTimeNotSetLabel;

@end

//  ArrivalTimesCell.m

#import "ArrivalTimesCell.h"

@implementation ArrivalTimesCell
@synthesize arrivalTimeNotSetLabel, arrivalAvoidTimesLabel, optimumArrivalTimeLabel, cityArrivalTimeLabel;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        arrivalTimeNotSetLabel = [[UILabel alloc] init];
        arrivalAvoidTimesLabel = [[UILabel alloc] init];
        optimumArrivalTimeLabel = [[UILabel alloc] init];
        cityArrivalTimeLabel = [[UILabel alloc] init];
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated{
    [super setSelected:selected animated:animated];

}

- (void)dealloc{
    [super dealloc];
    [arrivalTimeNotSetLabel release];
    arrivalTimeNotSetLabel = nil;
    [arrivalAvoidTimesLabel release];
    arrivalAvoidTimesLabel = nil;
    [optimumArrivalTimeLabel release];
    optimumArrivalTimeLabel = nil;
    [cityArrivalTimeLabel release];
    cityArrivalTimeLabel = nil;
}

@end

Here is a portion of cellForRowAtIndexPath for the UITableView

//  TripEditViewController.m

#import "ArrivalTimesCell.h"

@implementation TripEditViewController

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    CellIdentifier = @"ArrivalTimesCell";
    ArrivalTimesCell *cell = (ArrivalTimesCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil){
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ArrivalTimesCell" owner:nil options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = (ArrivalTimesCell *) currentObject;
                break;
             }
         }      
    }


    cell.cityArrivalTimeLabel.text = @"Whatever"
    cell.arrivalAvoidTimesLabel.text = @"Whatever";
    cell.optimumArrivalTimeLabel.text = @"Whatever";
    cell.arrivalTimeNotSetLabel.text = @"Whatever";

    return cell;  
}

Program execution stops on the loadNibNamed line without any comment in the console. If I "step into" I get the following which I am not sure has anything to do with the cause of my crash but instead is the result of the nib not loading properly...

2011-03-29 12:18:14.137 JetLogger[4565:207] * Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key cityArrivalTimeLabel.'
*
Call stack at first throw:
(
0 CoreFoundation 0x0111a5a9 exceptionPreprocess + 185
1 libobjc.A.dylib 0x0126e313 objc_exception_throw + 44
2 CoreFoundation 0x0111a4e1 -[NSException raise] + 17
3 Foundation 0x000ca677 _NSSetUsingKeyValueSetter + 135
4 Foundation 0x000ca5e5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 285
5 UIKit 0x0054e30c -[UIRuntimeOutletConnection connect] + 112
6 CoreFoundation 0x010908cf -[NSArray makeObjectsPerformSelector:] + 239
7 UIKit 0x0054cd23 -[UINib instantiateWithOwner:options:] + 1041
8 UIKit 0x0054eab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
9 JetLogger 0x0004bf18 -[TripEditViewController tableView:cellForRowAtIndexPath:] + 699
10 UIKit 0x003c7b98 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 634
11 UIKit 0x003bd4cc -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75
12 UIKit 0x003d28cc -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
13 UIKit 0x003ca90c -[UITableView layoutSubviews] + 242
14 QuartzCore 0x02051a5a -[CALayer layoutSublayers] + 181
15 QuartzCore 0x02053ddc CALayerLayoutIfNeeded + 220
16 QuartzCore 0x01ff90b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310
17 QuartzCore 0x01ffa294 _ZN2CA11Transaction6commitEv + 292
18 QuartzCore 0x01ffa46d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99
19 CoreFoundation 0x010fb89b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION
+ 27
20 CoreFoundation 0x010906e7 __CFRunLoopDoObservers + 295
21 CoreFoundation 0x010591d7 __CFRunLoopRun + 1575
22 CoreFoundation 0x01058840 CFRunLoopRunSpecific + 208
23 CoreFoundation 0x01058761 CFRunLoopRunInMode + 97
24 GraphicsServices 0x01a081c4 GSEventRunModal + 217
25 GraphicsServices 0x01a08289 GSEventRun + 115
26 UIKit 0x00360c93 UIApplicationMain + 1160
27 JetLogger 0x00001ba8 main + 102
28 JetLogger 0x00001b39 start + 53
)
terminate called after throwing an instance of 'NSException'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

挽心 2024-11-03 12:21:50

在笔尖的某个位置,您将某些内容连接到不具有该属性的对象上的 cityArrivalTimeLabel 属性。确保 1) 将单元格的类更改为 ArrivalTimesCell,并且 2) 将该标签连接到正确的对象。

您不需要在 init 方法中分配/初始化标签。它们只是在笔尖加载时被替换,所以在那之前只是浪费 RAM。

Somewhere in your nib, you connect something to the cityArrivalTimeLabel property on an object that does not have that property. Make sure you 1) changed the class of the cell to ArrivalTimesCell and 2) connected that label to the right object.

You do not need to alloc/init the labels in your init method. They are simply replaced when the nib loads, so it is just a waste of RAM until then.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文