为什么在加载TableViewcontroller时出现此错误

时间:2012-07-18 12:20:11

标签: iphone objective-c ios uitableview

我正在使用ARC和故事板开发iOS5项目。

我有一个带有注释的mapview,带有一个披露按钮,我的DetailView(这是一个TableViewController)但是当它应该被加载时,我得到以下错误:

2012-07-18 14:09:43.328 Zone-It-new[1966:707] Loadded the view for MapViewController
2012-07-18 14:11:40.467 Zone-It-new[1966:707] -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x138470
2012-07-18 14:11:40.470 Zone-It-new[1966:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILabel copyWithZone:]: unrecognized selector sent to instance 0x138470'
*** First throw call stack:
(0x3748488f 0x35189259 0x37487a9b 0x37486915 0x373e1650 0x311997ef 0x31195059 0x31194711 0x3119466b 0x311945e7 0x31284f63 0x311979bb 0x311973ad 0x31191b8b 0x311917d5 0x9386d 0x3120a93d 0x31284627 0x37cf5933 0x37458a33 0x37458699 0x3745726f 0x373da4a5 0x373da36d 0x33b99439 0x31186cd5 0x924b3 0x92458)
terminate called throwing an exception(lldb) 

这是我的detailviewcontroller.h:

#import <UIKit/UIKit.h>
#import "Event.h"

@interface DetailViewController :  UITableViewController <UITableViewDelegate, UITableViewDataSource>{
     IBOutlet UILabel *title;
     IBOutlet UILabel *description;
     IBOutlet UILabel *zone;
     IBOutlet UILabel *gemeente;
     IBOutlet UILabel *plaats;
     IBOutlet UILabel *deelnemers;
     IBOutlet UILabel *start;
     IBOutlet UILabel *einde;
     IBOutlet UILabel *id_nr;
}

@property (nonatomic) Event *event;
@property (nonatomic) IBOutlet UILabel *title, *zone, *description, *gemeente, *deelnemers, *start, *einde, *plaats, *id_nr;
@end

DetailViewController.m

的一部分
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [[self navigationController] setNavigationBarHidden:NO animated:YES];


    /*title.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;*/
    [title lineBreakMode];
    [title setText:[event title]];
    [title sizeToFit];

    gemeente.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;
    [title lineBreakMode];
    [gemeente setText:[event gemeente]];
}

这是通过ListView创建视图的地方:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"detail"];
    SingletonManager *sharedManager = [SingletonManager sharedManager];

    [detail setEvent:[sharedManager.eventsManager objectAtIndex:indexPath.row]];

    [self.navigationController pushViewController:detail animated:YES];
}

Event.h

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>

@interface Event : NSObject <MKAnnotation>


// required property from mkanotation
@property (nonatomic) CLLocationCoordinate2D coordinate;

// Optional
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *description;
@property (nonatomic, copy) NSString *zone;
@property (nonatomic, assign) NSString *gemeente;
@property (nonatomic, copy) NSString *straat;
@property (nonatomic, assign) int deelnemers;
@property (nonatomic, copy) NSDate *start;
@property (nonatomic, copy) NSDate *einde;
@property (nonatomic, copy) NSString *plaats;
@property (nonatomic, readonly) int id_nr;
@property (nonatomic, assign) int huisnummer;



@end

-----更多调试信息-------

在使用异常断点时,它停在这里:

[self.navigationController pushViewController:detail animated:YES];

控制台:

2012-07-18 15:53:46.691 Zone-It-new[179:707] Loadded the view for MapViewController 
2012-07-18 15:54:01.940 Zone-It-new[179:707] -[UILabel copyWithZone:]: unrecognized selector sent to instance 0x170bb0 
(lldb)

3 个答案:

答案 0 :(得分:4)

您的代码中某处似乎正在尝试复制UILabel。 UIView子类不遵守NSCopying协议,因此尝试复制任何UIView都会导致异常(除非它是实现协议的子类)。我将搜索您的代码库以检查副本的发生位置。如果找不到任何明确复制UILabel的地方,请检查集合类。一些集合类将复制值(NSDictionary使用键执行此操作,因此如果您尝试使用UILabel作为NSDictionary的键,则会收到错误)。还要检查你的房产。您在显示的代码中显示的内容很好,但如果您在协议中为UILabel指定了copy,那么也会给出错误。

您还应该尝试标准调试技术,例如为所有异常设置断点。 (转到断点导航窗格,在底部单击加号)。这可以帮助您通过打破令人讨厌的代码行来找到问题。请注意,如果在Apple的代码中进行复制(例如设置NSDictionary密钥),断点可能不会破坏您的代码。

<强>更新

鉴于您的新代码,我建议您尝试以下方法:

  1. 尝试在代码中找到复制“任何内容”的任何位置。显然你没有明确地复制UILabel,但也许你不小心通过在某处传递错误的参数来复制它。例如:从“事件”属性中删除所有copy个关键字,然后重新测试。你可能不需要为NSString指定copy,但我们在这里做的是确保你不会意外地将UILabel设置为其中一个属性。如果代码没有中断,你没有修复它,但现在你知道问题是什么(尝试将UILabel分配给错误的属性)。
  2. 开始一次一个地注释掉各种代码块,以找出问题所在。例如,注释掉整个viewDidLoad方法并测试代码。如果它有效,你知道问题在那里。因此,取消注释方法的一部分并再次测试。继续重复,直到你缩小问题范围。如果它仍然与viewDidLoad中断,请取消注释并尝试使用不同的代码块。从本质上讲,你是在扮演侦探,试图找到令人讨厌的代码行。

答案 1 :(得分:1)

对此的修复是重命名title中的UIViewController属性。这是因为UIViewController已经定义了名为NSString *的{​​{1}}属性。

答案 2 :(得分:0)

这通常意味着您尝试将对象分配给无法处理它的方法,而不是该对象的属性。例如,尝试将UILabel设置为对象而不是该对象上的字符串属性。

我的猜测就是这一行:[gemeente setText:[event gemeente]];

这里也可能存在问题:

@property (nonatomic) Event *event;

您尚未将Event *event设置为实例变量,而是将其引用为一个变量。如上所述,请尝试self.event访问事件。