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];
}

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)
4

3 に答える 3

4

コードのどこかでUILabelをコピーしようとしているようです。UIViewサブクラスはNSCopyingプロトコルに準拠していないため、UIViewをコピーしようとすると、例外が発生します(プロトコルを実装するサブクラスでない場合)。コードベースを検索して、コピーが発生している場所を確認します。UILabelを明示的にコピーする場所が見つからない場合は、コレクションクラスを確認してください。一部のコレクションクラスは値をコピーします(NSDictionaryはキーを使用してこれを行うため、UILabelをNSDictionaryのキーとして使用しようとすると、エラーが発生します)。また、プロパティを確認してください。表示されたコードに表示される内容は問題ありませんがcopy、UILabelのプロトコルでを指定すると、エラーも発生します。

また、すべての例外にブレークポイントを設定するなど、標準のデバッグ手法を試す必要があります。(ブレークポイントのナビゲーションペインに移動し、下部にあるプラス記号をクリックします)。これは、問題のあるコード行を壊して問題を見つけるのに役立つはずです。Appleのコードでコピーが行われている場合(NSDictionaryキーの設定など)、ブレークポイントがコードで壊れない可能性があることに注意してください。

アップデート

新しいコードを考えて、次のことを試してみることをお勧めします。

  1. 「何でも」がコピーされるコード内の場所を見つけてください。明らかに、UILabelを明示的にコピーしていませんが、間違った引数をどこかに渡して誤ってコピーしている可能性があります。例:copyイベントプロパティからすべてのキーワードを削除して、もう一度テストします。とにかくNSStringを指定する必要はないかもしれませんがcopy、ここで行っているのは、UILabelをこれらのプロパティの1つに誤って設定していないことを確認することです。コードが壊れない場合は、修正していませんが、問題が何であるかがわかります(UILabelを間違ったプロパティに割り当てようとしています)。
  2. 問題を見つけるために、コードのさまざまなブロックを一度に1つずつコメントアウトし始めます。たとえば、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 に答える