1

私が思うに単純なものが欠けていますが、これを解決せずに何日もそれを続けています。今のところそれを解決するためだけに「回避策」を作成し始めましたが、それでもこれを「正しい」方法で解決したいと考えています。助言がありますか?ありがとう!

.

問題:

クラス Adealer が欠落しているようです (エラー "-[Adealer objectAtIndex:]: 認識されないセレクターがインスタンス 0x8c5f8b0 に送信されました") が表示されますが、この "detailsVC" に Adealer.h をインポートしました。しかし、それは単にプロパティの名前を間違っているという単純なエラーではありません( objectForKey:@"CustName"「custname」などの代わりに - これを何度もテストしました)。

また、Adealer のようなクラスのない同様の「listVC」もあり、同じ方法で同じ「detailsVC」にデータを転送し、問題なく動作します。次に、次のような呼び出しでデータを取得します。

self.labelRestName.text = [restDetails objectForKey:@"CustName"];

概要:

データを作成してリストを表示するtableViewController「listVC」を取得し、次に詳細を表示するViewController「detailsVC」を取得しました。データ (「listVC」で選択された行オブジェクトは、seque および「destVC.restGPSTransfer」(NSDictionary) を介して転送されます。データは「detailsVC」で問題なく到着し、端末では次のようになります。

dealerName = Uppsala Centrum Test
dealerAdressStreet = Dragarbrunnsgatan 55
dealerAdressZip = 75320
dealerAdressCity = Uppsala
dealerLongitude = 17.63893
dealerLatitude = 59.85856
dealerDistance2 = 8586398.000000
etc

.

次のデータ:

「リストVC」

1) 最初に、AFNetworking json オブジェクトを介して Web から NSMutableArray "restFeed" にデータをフェッチします。

2) 次に、このループ内で NSMutableArray に独自のデータを作成し、NSMutableArray "updatedDealers" - わかりました。

    NSMutableArray *updatedDealers = [[NSMutableArray alloc]init];
        while (i+1 < [_restFeed count]) {
          i++;

    // Get dealer position function here        
    // Get distance function here

    // Then create my own data here (also #imported Adealer to "listVC";
            Adealer *theDealer = [[Adealer alloc]init];

    theDealer.dealerName = [[_restFeed objectAtIndex:i]objectForKey:@"CustName"];
    theDealer.dealerLongitude = [[_restFeed objectAtIndex:i]objectForKey:@"long"];
    theDealer.dealerLatitude = [[_restFeed objectAtIndex:i]objectForKey:@"lat"];
    theDealer.dealerDistance2 = theDistance;
    // etc...

    // Check if data ok
    NSLog(@"theDealer = %@",[theDealer description]);

    // Don't add dealer object without positiondata to the new array
    if (![theDealer.dealerLatitude isEqualToString:@""]) {          
        [updatedDealers addObject:theDealer];
    }

3) 次に、NSSortdescriptor を使用して NSMutableArray "updatedDealers" 内のディーラーを距離順にソートし、最後にこれを使用して新しい NSMutableArray "restFeed" を作成します。( @synthesize dealerFeed = _dealerFeed;「listVC」で「」も実行) - わかりました。

    _dealerFeed = [NSMutableArray arrayWithArray:sortedContestArray];

4) この配列をいくつかの tableViewCells に入力すると、問題なく動作します。

    cell.cellDealerName.text = [NSString stringWithFormat:@"%@",[[_dealerFeed objectAtIndex:indexPath.row]dealerName]];

5) 関数 didSelectRowAtIndexPath で、選択されたオブジェクトを「detailsVC」の NSDictionary 「restGPSTransfer」で転送します。

    destVC.restGPSTransfer = [_dealerFeed objectAtIndex:myIndexPath.row];

"detailsVC":

6) データは問題なく転送されているようですが (この投稿の上部を参照)、データを呼び出そうとすると、

    self.labelRestName.text = [restGPSTransfer objectForKey:@"dealerName"];

次のエラーが表示され、アプリがクラッシュします。

さらにいくつかのテストが行​​われました...

NSDictionary「restGPSTransfer」の構造+キーとプロパティを確認しようとしましたが、説明を使用してもこれまでのところしかわかりませんでした。私の問題は解決していませんが、「認識されないセレクター」というエラーが引き続き表示されます。辞書の中の辞書か何かになったのでしょうか?

プロパティが実際に存在するかどうかを確認するために、この簡単な if-test を作成しました。しかし、すべてのプロパティを「手動で」チェックする必要があります。穴 NSDictionary / NSArray をチェックするよりスマートな方法はおそらくありますか?

if ([restGPSTransfer objectForKey:@"dealerName"]) {
    NSLog(@"= YES! key exists.");
} else {
    NSLog(@"= Nope! key don't exists");
}

これについて助けてくれてありがとう:-)

.

Adealer クラス ファイルを更新します。

Adealer.h

#import <Foundation/Foundation.h>

@interface Adealer : NSObject
@property (nonatomic, retain) NSString * dealerName;        
@property (nonatomic, retain) NSString * dealerAdressCity;
@property (nonatomic, retain) NSString * dealerAdressStreet;
@property (nonatomic, retain) NSString * dealerAdressZip;   
@property (nonatomic, retain) NSNumber * dealerID;
@property (nonatomic, retain) NSString * dealerImages;      
@property (nonatomic, retain) NSString * dealerLogo;        
@property (nonatomic, retain) NSString * dealerMail;        
@property (nonatomic, retain) NSString * dealerProducts;    
@property (nonatomic, retain) NSString * dealerTel;         
@property (nonatomic, retain) NSString * dealerText;    
@property (nonatomic, retain) NSString * dealerWeb; 
@property (nonatomic, retain) NSString * dealerLongitude;   
@property (nonatomic, retain) NSString * dealerLatitude;    
@property (nonatomic, retain) NSString *dealerDistance; 
@property float dealerDistance2;
@end

アディーラー.m

#import "Adealer.h"
@implementation Adealer
@synthesize dealerAdressCity, dealerAdressStreet, dealerAdressZip, dealerID, dealerImages, dealerLogo;
@synthesize dealerMail, dealerName, dealerProducts, dealerTel, dealerText, dealerWeb;
@synthesize dealerLongitude, dealerLatitude, dealerDistance,dealerDistance2;
- (NSString *)description {
// Added extension of description

NSMutableString *string = [NSMutableString string];

[string appendString:@"\ntheDealer object and it's properties:\n"];

[string appendFormat:@"dealerName = %@\n", dealerName];
[string appendFormat:@"dealerAdressStreet = %@\n", dealerAdressStreet];
[string appendFormat:@"dealerAdressZip = %@\n", dealerAdressZip];
[string appendFormat:@"dealerAdressCity = %@\n", dealerAdressCity];

[string appendFormat:@"dealerTel = %@\n", dealerTel];
[string appendFormat:@"dealerMail = %@\n", dealerMail];
[string appendFormat:@"dealerWeb = %@\n", dealerWeb];

[string appendFormat:@"dealerLogo = %@\n", dealerLogo];
[string appendFormat:@"dealerImages = %@\n", dealerImages];
[string appendFormat:@"dealerText = %@\n", dealerText];
[string appendFormat:@"dealerProducts = %@\n", dealerProducts];

[string appendFormat:@"dealerLongitude = %@\n", dealerLongitude];
[string appendFormat:@"dealerLatitude = %@\n", dealerLatitude];
[string appendFormat:@"dealerDistance = %@\n", dealerDistance];
[string appendFormat:@"dealerDistance2 = %f\n\n", dealerDistance2];
return string;
}
@end
4

1 に答える 1

0

解決しました! 他の誰かがここに必要な場合に投稿します。

ソリューション

私の「detailsVC」では、最初にこの iVar 宣言を行いました。

.h:

Adealer *theDealer;
@property (nonatomic, retain) Adealer *theDealer;

.m:

@synthesize theDealer;

次に、「listVC」でこれを実行して、Adealer オブジェクトとそのプロパティを「detailsVC」に転送しました (説明した「ループ」の前半で、Adealer オブジェクトは既にそのプロパティを取得していることを思い出してください)。

私の以前の代わりに;

destVC.restGPSTransfer = [_dealerFeed objectAtIndex:myIndexPath.row];

に変更しました。

destVC.theDealer = [_dealerFeed objectAtIndex:myIndexPath.row];

実際に「detailsVC」で転送されたプロパティを表示して確認するには、これを呼び出してディーラー名 (またはその他のプロパティ) を取得します。

self.labelRestName.text = theDealer.dealerName;
NSLog(@"theDealer.name = %@",theDealer.dealerName);

よく働く!みんなハッピーコーディング!

于 2013-01-21T10:19:18.227 に答える