認識できないセレクタがインスタンスに送信されました

私はいくつかのスレッドを読んだ後でさえ理解できないという問題があります

これは私が得るエラーです:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage length]: unrecognized selector sent to instance 0x576f8f0'

これはコードです:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *filePath = [[self documentsPath] stringByAppendingPathComponent:@""];

    NSFileManager *imagesFileManager = [NSFileManager defaultManager];

    imagesArr = [[imagesFileManager contentsOfDirectoryAtPath:filePath error:nil]filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"]];

    arryList = [[NSMutableArray alloc] initWithArray:[imagesArr copy]];//display text
    imagesList = [[NSMutableArray alloc]init];//display image

    NSString *docPath = [self documentsPath];

    for (NSString *anImagePath in arryList) {
        anImagePath = [NSString stringWithFormat:@"%@/%@",docPath,anImagePath];
        UIImage *image = [UIImage imageWithContentsOfFile:anImagePath];
        if (image)
            [imagesList addObject:image];

        NSLog(@"%@", anImagePath);
    }
}   
0
ループ内のループ変数 anImagePath は変更しないでください。それは動作するように見えるかもしれませんが、それは悪いスタイルであり、混乱します。
追加された 著者 Adam Rosenfield,
エラーがどこにあるのかを指摘するコンソールログに例外トレースバック(壊れたiOS 5を実行している場合を除く)が必要です。 UIImageを実際に指しているポインタで length を呼び出しているところです(別のものとして型指定されていても)。時にはこれはオブジェクトの保持に失敗したために発生しますが、それ以外のときは単に間違った値を何かに割り当てるだけです。
追加された 著者 Hot Licks,
ロギングを試してください - クラッシュする前にこのメソッドをどのくらいまで取得するかを確認してください
追加された 著者 DanZimm,
このエラーは、実装していない UIImage length メソッドを呼び出そうとしているというエラーです。このメソッドが呼び出されている場所で、コード内の他の場所を探してみてください。
追加された 著者 Luiz Carlos Querino Filho,

2 答え

for ループは、 UIImage length を呼び出すものではありません。 NSString * anImagePath で本質的に型キャストされているため、 arrayList のオブジェクトは実際に画像ですが、ループは文字列であると考えているからです。このコードを変更してみてください:

for (NSString *anImagePath in arryList) {
    anImagePath = [NSString stringWithFormat:@"%@/%@",docPath,anImagePath];
    UIImage *image = [UIImage imageWithContentsOfFile:anImagePath];
    if (image)
        [imagesList addObject:image];

    NSLog(@"%@", anImagePath);
}

これに:

for (UIImage *image in arryList) {
    if (image)
        [imagesList addObject:image];

    NSLog(@"%@", anImagePath);
}

私はあなたが既に UIImage オブジェクトを配列に格納していることを推測しています。詳細については、画像の配列を表示しようとすると、コードがiphoneをホーム画面に戻します

6
追加された
NSFileManagerの contentsOfDirectoryAtPath:error:はNSStringの配列を返します。 ( Ref )。その場合、 arryList もNSStringの配列になります。それで問題は解決しません。
追加された 著者 Ilanchezhian,
@ user1063188なぜこの答えを受け入れなかったのですか?
追加された 著者 aopsfan,
うーん...なぜ、取り込んだ arrayList を新しいイメージパスで置き換えようとしているのですか?
追加された 著者 aopsfan,
イメージの代わりに文字列の配列を返します
追加された 著者 user1063318,

さて、もう一度やってみましょう。うまくいけば今回私はあなたの問題をよりよく理解しています。 forin にはコレクションを変更しようとすると問題が発生します。

これを変更する:

for (NSString *anImagePath in arryList) {
    anImagePath = [NSString stringWithFormat:@"%@/%@",docPath,anImagePath];

これに:

for (NSString *anImagePath in imagesArr) {
    [arrayList setObject:[NSString stringWithFormat:@"%@/%@",docPath,anImagePath]
                 atIndex:[imagesArr indexOfObject:anImagePath]];

このようにして、変更する配列のコピーを循環させます。変更する配列は変更しません。しかし、これはむしろ悪いコードです( arrayList imagesArr のコピーとして作成し、そのすべてのオブジェクトを破棄します)。

これを変更する:

arrayList = [[NSMutableArray alloc] initWithArray:[imagesArr copy]];

これに:

arrayList = [[NSMutableArray alloc] init];

Then in our forin loop, これを変更する:

for (NSString *anImagePath in imagesArr) {
    [arrayList setObject:[NSString stringWithFormat:@"%@/%@",docPath,anImagePath]
                 atIndex:[imagesArr indexOfObject:anImagePath]];

これに:

for (NSString *anImagePath in imagesArr) {
    [arrayList addObject:[NSString stringWithFormat:@"%@/%@",docPath,anImagePath]];

これがうまくいくといいですね!

0
追加された
@ user1063318はこの作業を行いましたか?もしそうなら、答えを投票してその横にある中空のチェックマークをクリックしてください。これは、これが正しい解決策であることを他の人に示します。
追加された 著者 aopsfan,
私のコードを見て、私に答える時間を費やしてくれてありがとう
追加された 著者 user1063318,