2016-10-20 2 views
0

多分誰かが私を助けることができます。私は間違いをしない。私はtableViewと簡単なアプリケーションを持っています。そのテーブルのビューには、多くの異なるものがリストされています。ユーザーがセルをクリックすると、ViewControllerにアクセスし、選択したセルのさまざまな写真や説明を見ることができます(たとえば、Dog initという名前のセルをクリックすると、イヌの写真や説明が表示されます)。すべての "事"のために私は自分のクラスを作りました。たとえば、私はクラスの犬、猫、車を持っています。すべてのクラスで、私はPictureViewとTableViewControllerに返されるテキストファイルを含む配列を作成しました。オブジェクトを配列に入れる方法は?

私はTableViewControllerに異なるクラスのオブジェクトを作成しました:

#import "IphoneTabelle.h" 
#import "ViewController.h" 
#import "Dogs.h" 
#import "Cats.h" 

@interface IphoneTabelle() 


@end 


@implementation IphoneTabelle 


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    /
    //create dog object for array 
    Dogs *dogClass = [[WLAN alloc]init]; 
    _createdClassObjectArrayPics = dogClass.picsDogs; 
    _createdClassObjectArrayText = dogClass.textDogs; 



    //Cat objects created for array 

    Cats *catClass = [[ControlCenter alloc]init]; 
    _createdClassObjectArrayPics = catClass.picsCats; 
    _createdClassObjectArrayText = catClass.textCats; 


    //create objects if they dont exists 
    if (!_objects){ 
     _objects = [[NSMutableArray alloc] init]; 
    } 


    //put the class-objects array in objects array 
    [_objects addObject:NSStringFromClass([dogClass class])]; 

    [_objects addObject:NSStringFromClass([catClass class])]; 

をだから、wennユーザーがセグエが使用されているセルをクリックします。ピクチャとテキストは、ViewController.hから配列に格納されるはずです。これらの配列は、ViewController内のピクチャとテキストを表示するために使用されます。 、その理由を 「NSInvalidArgumentException」:ユーザーがセルをクリックすると

セグエコード

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    ViewController *sendDataToViewController = segue.destinationViewController; 

    NSIndexPath *indexPath = nil; 
    NSArray *picturesArrayTableView = [[NSArray alloc]init]; 
    NSArray *texteArrayTableView = [[NSArray alloc]init]; 


    if([segue.identifier isEqualToString:@"show"]){ 


     picturesArrayTableView = _createdClassObjectArrayPics[indexPath.row]; 
     texteArrayTableView = _createdClassObjectArrayText[indexPath.row]; 


    //picsArray and textsArray are declared in ViewController.H file 
     sendDataToViewController.picsArray= picturesArrayTableView; 
     sendDataToViewController.textsArray = texteArrayTableView; 



    } 

だから私は毎回エラーが発生します - :認識されていないセレクタがインスタンスに送信された」[__ NSCFConstantStringカウント]を0x10becc198 '

何とかピクチャとテキストのデータがpicturesArrayTableViewとtexteArrayTableViewにありません。

どのようにして1つのセグで仕事を得ることができますか?私はすべての細胞/物体のためにセグをしたくありません。その方法は確かに動作しますが、何百ものセグを作成するのは本当に面倒で面倒です。

何とか私の質問を明確にすることができれば幸いです。

+0

このdogClass.picsDogsは何を返しますか? –

+0

'_createdClassObjectArrayPics'は常に最後にオブジェクトを追加します。あなたの場合はcatClass.picsCatsです。 – Mahesh

+0

異なるクラスはピクチャの配列とテキストの配列を返しています。 – podoi17

答えて

0

次のようにDogクラスを作成します。

@interface Dog : NSObject 

@property (nonatomic, strong) NSMutableArray *pics; 
@property (nonatomic, strong) NSMutableArray *texts; 


@end 

は、オブジェクトを作成し、配列にそれを追加することをあなたは、テーブルタップ

Dog *dogObject=[[Dog alloc]init]; dogObject.pics = [[NSMutableArray alloc]init]; dogObject.texts = [[NSMutableArray alloc]init]; //Add some Pics to dog [dogObject.pics addObject:[UIImage imageNamed:@"dog.png"]]; //or you can add objects from another array //Add Text for that pic [dogObject.texts addObject:@"Cute Dog"]; //Note that Pics and text array will have same count //create objects if they dont exists if (!arrObject){ arrObject = [[NSMutableArray alloc] init]; } [arrObject addObject:dogObject]; 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"Show" sender:indexPath]; 
} 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 

    if([segue.identifier isEqualToString:@"Show"]) 
    { 
     //getting indexpath for selected Item 
     NSIndexPath *indexPath = (NSIndexPath *)sender; 
     id selectedObject=[arrObject objectAtIndex:indexPath.row]; 

     //getting View Controller 
     ViewController *sendDataToViewController = segue.destinationViewController; 

     //pass selected item to destingation View Controller 
     sendDataToViewController.selectedItem = selectedObject; 
    } 


} 

詳細ビューコントローラで渡されたオブジェクトをキャッチします。これを行うには、Detail ViewControllerクラスのPropertyを作成する必要があります。

@property (nonatomic, strong) id selectedItem; 

このオブジェクトの写真やテキストにアクセスできます。

 if ([selectedItem isKindOfClass:[Dog class]]) 
     { 
      // we got the dog object 
      Dog *dogObject =(Dog *)selectedItem; 

      //access Pics Like follow 

      UIImage *image = [dogObject.pics objectAtIndex:0]; 
      NSString *text = [dogObject.texts objectAtIndex:0]; 

     } 
     else [selectedItem isKindOfClass:[Cat class]] 
     { 
      //Same above Thing 
     } 

これは単なる例であり、あなたが望むように利用することができます。

+0

ああ、ありがとう、私はそれを実装しようとします – podoi17

+0

私は私のコードにそれを実装しようとしました。シミュレータでコードを実行すると、次のエラーが発生します。 – podoi17

+0

2016-10-20 19:37:45.763 HowToIphone [5898:4944908] _objects内のオブジェクトが( ""、 " 」 ) 2016年10月20日19:37:45.770 HowToIphone [5898:4944908] - [WLAN isEqualToString:]:認識されていないセレクタインスタンスに0x600000246e10 を送った私は多分アレイに問題があると考えオブジェクトの、それは理由ログステートメントです。私は、オブジェクト配列がcellLablesに何を書き込むべきか分からないというエラーが起きていると感じています。しかし多分私は完全に間違っていて、間違いは別の場所にある – podoi17

関連する問題