0

私はすでにこの質問をしましたが、回答が得られなかったので、おそらく十分に明確ではありません...とにかく、ここで回答を得るための2回目の試みです.

私は 2 つのビューを持つ単純なアプリを持っています。各ビューには、ストーリーボードで特定のクラス名に設定されたクラスがあります。

  1. メイン ビュー (MainViewController)
  2. ClientDetailView (ClientDetailViewController)

メイン ビューには、「クライアント」のリストを表示するリストがあります。これは、今のところ、メール アドレスのリストにすぎません。メールをクリックすると、クリックされたリストの行のメールで 2 番目のビューに遷移したい。

ClientDetail ビューで、キーと呼ばれる電子メール アドレスを受け入れるようにプロパティを設定しています。エラーがないと仮定して、Text にキーを UILabel に割り当てて、正しいデータが渡されたことを確認します。

OK コードの時間です。

これが私の prepareForSegue メソッドです。さまざまなことを試してきたので、いくつかのコメントを見ることができます...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showClientDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        ClientDetailViewController *destViewController = (ClientDetailViewController *)segue.destinationViewController;
        //destViewController.key = [self.clients objectAtIndex:indexPath.row];
        [destViewController setKey:[self.clients objectAtIndex:indexPath.row]];
    }
}

例外がスローされたときに得られる出力は次のとおりです

2013-05-21 13:56:50.484 ClientManager[19728:11603] -[NSManagedObject isEqualToString:]: unrecognized selector sent to instance 0x8624f90
2013-05-21 13:56:50.485 ClientManager[19728:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject isEqualToString:]: unrecognized selector sent to instance 0x8624f90'
*** First throw call stack:
(0x1fa4012 0x13e1e7e 0x202f4bd 0x1f93bbc 0x1f9394e 0x1764af 0x176674 0x5871 0xfe817 0xfe882 0xfeb2a 0x115ef5 0x115fdb 0x116286 0x116381 0x116eab 0x1174a3 0x117098 0x472da3 0x464ad9 0x464b54 0xcc899 0xccb3d 0xad3e83 0x1f63376 0x1f62e06 0x1f4aa82 0x1f49f44 0x1f49e1b 0x1efe7e3 0x1efe668 0x1d65c 0x1e2d 0x1d55)
libc++abi.dylib: terminate called throwing an exception

チュートリアル、スタックトレースを読んで読み直しましたが、これを理解できません。私は iOS 開発にかなり慣れていないので、専門家からの助けを本当に感謝しています。

十分な情報を投稿していない場合は、私の投稿に反対票を投じたり、私を侮辱したりしないでください。

ありがとう

- - - - - - -アップデート - - - - - - - -

わかりましたので、いくつかのアドバイスの後、デバッガーでこれを実行しました

p (char*)object_getClassName(self.clients[0])

そして、問題の一部は、setKey を呼び出すときにオブジェクト NSManagedObjec_Client を参照していることにあるように見えるので、失敗する理由がわかりました。

ここから、オブジェクトのプロパティを取得してキーを設定する方法がわかりません。

これが MainViewController.m にあるものです

@property (strong) NSMutableArray *clients;

- (void)viewDidLoad
{
    [super viewDidLoad];

        // Fetch the devices from persistent data store
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Client"];
    self.clients = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

    [self.tableView reloadData];

}

それに基づいて、何らかの方法で NSManagedObject_Client_ をキャストし、emailAddress プロパティを取得する必要があると思います。そうですか?どうすればいいのですか?

4

2 に答える 2

0

この行:

[destViewController setKey:[self.clients objectAtIndex:indexPath.row]];

管理オブジェクト自体を渡します。emailAddress 属性を渡したい場合は、管理対象オブジェクトで valueForKey を使用する必要があります。

[destViewController setKey:[[self.clients objectAtIndex:indexPath.row] valueForKey:@"emailAddress"];

「キー」という名前は、プロパティのやや紛らわしい名前かもしれません。valueForKey: に渡す必要があるキーとは関係ありません。emailAddress など、それが何を表しているかを説明するような名前にしたほうがよいと思います。

于 2013-05-21T21:51:53.970 に答える