0

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

我有一个带有注释的地图视图,其中有一个显示按钮转到我的 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];
}

事件.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)
4

3 回答 3

4

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

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

更新

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

  1. 尝试在代码中找到复制“任何内容”的任何位置。显然你没有明确地复制 UILabel 但也许你通过在某处传递错误的参数而意外地复制了它。例如:copy从您的事件属性中删除所有关键字并再次测试。无论如何,您可能不需要copy为 NSString 指定,但我们在这里所做的是确保您不会意外地将 UILabel 设置为这些属性之一。如果代码没有中断,您没有修复它,但现在您知道问题出在哪里(尝试将 UILabel 分配给错误的属性)。
  2. 开始注释各种代码块,一次一个,以找出问题所在。例如,注释掉您的整个viewDidLoad方法并测试您的代码。如果它有效,您就知道问题出在那儿。所以取消注释部分方法并再次测试。不断重复,直到你缩小了问题的范围。如果它仍然中断viewDidLoad,请取消注释并尝试不同的代码块。从本质上讲,您是在扮演侦探的角色,试图找出有问题的代码行。
于 2012-07-18T12:27:56.567 回答
1

解决此问题的方法是重命名title. UIViewController这是因为UIViewController已经定义了NSString *一个名称为 的属性title

于 2012-07-18T17:01:44.733 回答
0

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

我的猜测是这条线: [gemeente setText:[event gemeente]];

这里也可能存在问题:

@property (nonatomic) Event *event;

您尚未设置Event *event为实例变量,但将其作为一个引用。尝试self.event访问上面的事件。

于 2012-07-18T12:27:27.570 回答