Werteübergabe will nicht funktionieren

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo zusammen,

ich sitze jetzt schon 2 Tage an diesem Problem und komme nicht dahinter wo der Fehler liegt.
Es geht um eine ganz einfache Werteübergabe, die stattfinden soll. Aber nach dieser Übergabe
ist der gespeicherte Wert immer "null". Ich kann mir nicht erklären warum, weil ich sowas schon
100 mal gemacht habe.

Ich habe folgende Delegate-Methode des UICollectionView
Code:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Choosed Item: %i",indexPath.row);
    
    NSDictionary* specificAlbumDict = [allAlbumsArray objectAtIndex:indexPath.row];
    
    allTracksArray = [specificAlbumDict objectForKey:@"tracks"];
    theString = @"Test Track";
}
dort speichere ich ein umfangreiches Array in "allTracksArray".
Dort kommt auch noch alles an. Alle Attribute sind mit Werten gefüllt.

Jetzt will ich die so gewonnenen Werte über
prepareForSegue an den danach kommenden TableView übergeben.
Code:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"allTracksArray: %@", allTracksArray);
    [segue.destinationViewController setTestString:theString];
    [segue.destinationViewController setAllTracks:allTracksArray];
}
une bereits in dieser Methode (ist ja noch in der gleichen Klasse) ist direkt alles "null". Alle Werte sind dann plötzlich weg, und es kommt natürlich auch nichts beim TableView an.

Noch ein Auszug aus meiner .h-Datei:
Code:
@property (strong, nonatomic) NSArray *allTracksArray;
@property (strong, nonatomic) NSMutableArray *carImages;
@property (strong, nonatomic) NSMutableArray *coverArray;
@property (strong, nonatomic) NSString *theString;
@property (strong, nonatomic) NSMutableArray *myArray;
Warum werden keine Werte übergeben. Was mache ich falsch???
 
Ohne weitere Informationen kann man dazu nichts allzu Konkretes sagen.

Aber es sieht verdächtig aus, dass Du allTracksArray und theString direkt zuweist, ohne die setter-Methoden zu verwenden.

Das zugewiesene Element ist außerdem ein Element eines Dictionarys, das sich in einem Array befindet. Kannst Du wirklich sicher sein, dass dieses Element zum Verwendungszeitpunkt noch existiert? Wenn nein, musst Du entweder ein retain oder ein copy auf dieses Element durchführen.
 
Hallo, danke für deine Antwort?

Welche Informationen benötigt du? Stelle gerne alles zur Verfügung.

Momentan geht es nur um werteübergabe innerhalb einer Klasse.
In der Delegate Methode habe ich nun versucht dem String einen Wert mit
[self setTheString:@"Hallo Welt"] zuzuweisen, mache ich direkt danach ein NSLog ist der Text angekommen,
dann wird sofort die Methode prepareForSegue() aufgerufen. Mach ich innerhalb dieser methode einen NSLog ist der String: "null"
das gleiche gilt für allTracks Array.

Jetzt ist mir noch etwas aufgefallen. Wenn ich innerhalb von prepareforSegue() allAlbumsArray mit NSLog ausgeben lassen, hat das Attribute einen Wert und ist nicht null so wie alle anderen Attribute. wieso ist das mit diesem Attribut anders?
Ich habe dann allTacksArray auf die gleiche weise definiert wie allAlbumsArray und trotzdem ist immer alles "null".

und noch etwas: weise ich dem Attribut "theString" innerhalb von viewDidLoad() einen wert zu bleibt dieser erhalten. Ich kann es mir beim besten willen nicht erklären.
 
Pobiere mal folgendes:

Code:
//Album holen
[LEFT][COLOR=#333333]NSDictionary* specificAlbumDict = [self.allAlbumsArray objectAtIndex:indexPath.row];[/COLOR]  

[/LEFT]
//Vorausgesetzt das allTracksArray ist als property definiert
self.allTracksArray = [specificAlbumDict objectForKey:@"tracks"]; 

//Und in prepareForSegue:
NSLog(@"allTracksArray: %@", self.allTracksArray);    
[segue.destinationViewController setAllTracks:self.allTracksArray];
 
Hallo Buhmi,

danke für den Tipp aber es ist leider weiterhin alles null.

Wie gesagt: wenn ich allAlbumsArray in prepareForSegue ausgeben lasse, dann sind da Werte drin.
Alles andere was ich dort ausgeben lasse ist null .... und das ist doch echt widersprüchlich.

Ich habe bei properties andere Parameter eingesetzt, dann ganz ohne Property definiert, dann in viewDidLoad
ein alloc/init gemacht (dann ist das array nicht null aber leer) und nichts funktioniert.

Dann habe ich mein Model ins spiel gebracht und diesem erstmal die werte zugewiesen in der delegate Methode, sobald ich dann in prepareForSegue() die werte des Models auslesen will ist alles null, das ist echt zum verrückt werden

Ich habe mir ein altes Projekt angeschaut, dort gibt es zwar keine CollectionView aber eine TableView und da funktioniert alles super so wie es sein soll.
Was kann ich jetzt noch machen? Ich weiß echt nicht mehr weiter. es muss doch gehen.
 
Wie greifst du denn im destinationViewController auf das allAlbumsArray zu? Und zu welchem Zeitpunkt? Am hilfreichsten wäre hier der Code des betreffenden ViewControllers ;)
 
Innerhalb des destinationViewControllers (es ist ein TableViewController) greife ich nicht auf das allAlbumsArray zu. Ich lasse es innerhalb von prepareForSegue nur ausgeben. Das hab ich nur zu Testzwecken gemacht. Stattdessen soll allTracksArray an den destinationViewController übergeben werden. Das passiert mit [segue.destinationViewController setAllTracks:self.allTracksArray]; aber zu diesem Zeitpunkt ist self.allTracksArray schon null, deshalb wird auch null übergeben.

Ich liste jetzt nachfolgend beide ViewController auf (hab alleirdings viel Beispieldaten und Kommentare drin) :
Den wichtigen Bereich habe ich gekennzeichnet mit Anfang und Ende, die URLS auf die ich zugreife muss ich aus datenschutzteschnichen Gründen rausnehmen.

Zuerst der HauptViewController
Code:
//
//  CoverCollectionViewController.m
//  SimfyProject
//
//  Created by Christian Mansch on 07.12.12.
//  Copyright (c) 2012 Christian Mansch. All rights reserved.
//

#import "CoverCollectionViewController.h"


@interface CoverCollectionViewController ()
{
    //NSMutableArray *allAbmunsArray;
    NSDictionary* allTracks;
}
@end

@implementation CoverCollectionViewController
@synthesize carImages = _carImages;
@synthesize coverArray;
@synthesize theString;
@synthesize allTracksArray;
@synthesize allAbmunsArray;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    _carImages = [@[@"chevy_small.jpg",
                  @"mini_small.jpg",
                  @"rover_small.jpg",
                  @"smart_small.jpg",
                  @"highlander_small.jpg",
                  @"venza_small.jpg",
                  @"volvo_small.jpg",
                  @"vw_small.jpg",
                  @"ford_small.jpg",
                  @"nissan_small.jpg",
                  @"honda_small.jpg",@"jeep_small.jpg"] mutableCopy];
    
    UICollectionViewFlowLayout *myFlowLayout = [[UICollectionViewFlowLayout alloc] init];
    [myFlowLayout setItemSize:CGSizeMake(106, 100)];
    [myFlowLayout setMinimumInteritemSpacing:1];
    [myFlowLayout setMinimumLineSpacing:1];
    [self.collectionView setCollectionViewLayout:myFlowLayout];
    
    theTracklist = [[Tracklist alloc] init];
    
    coverArray = [[NSMutableArray alloc] init];
    //[self prepareCoverDataForRequest];

    [self prepareJSONData:[self getJSONData]];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - UICollectionViewDataSource

-(NSInteger)numberOfSectionsInCollectionView:
(UICollectionView *)collectionView
{
    return 1;
}

-(NSInteger)collectionView:(UICollectionView *)collectionView
    numberOfItemsInSection:(NSInteger)section
{
    return 12;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                 cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CoverCollectionViewCell *coverCell = [collectionView
                                    dequeueReusableCellWithReuseIdentifier:@"CoverCell"
                                    forIndexPath:indexPath];
    
    UIImage *image;
    int row = [indexPath row];
    
    image = [UIImage imageNamed:_carImages[row]];
    
    coverCell.coverImageView.image = image;
    
    //NSLog(@"Array: %@", [coverArray objectAtIndex:0]);
    //coverCell.coverImageView.image = [coverArray objectAtIndex:indexPath.row];
    
    return coverCell;
}

/******************** BETROFFENER BEREICH - ANFANG*******************************/

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

    NSLog(@"allTracksArray: %@", self.allTracksArray);  // Ist hier schon null
    NSLog(@"TheString: %@", self.theString);            // Ist hier ebenfalls null
    NSLog(@"allAlbumsArray: %@", allAbmunsArray);       // AllAlbumsArray hat hier tatsächlich einen Wert, wieso nur dieses Attribut???
    
    [segue.destinationViewController setTestString:theString]; //Natürlich wird hier dann auch null übergeben
    [segue.destinationViewController setAllTracks:self.allTracksArray]; // genauso wie hier
}

#pragma mark - UICollectionViewDelegate

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    
    NSDictionary* specificAlbumDict = [self.allAbmunsArray objectAtIndex:indexPath.row];
    
    self.allTracksArray = [specificAlbumDict objectForKey:@"tracks"];
    
    theString = @"Test Track";
    NSLog(@"allTracks im DElegate: %@", self.allTracksArray); //Hier hat self.allTracks noch den korrekten Wert
    
    
}

/************************ ENDE ******************************************/

#pragma mark - JSON Data Tramsmission

-(void)prepareJSONData:(NSData *)jsonData
{
    NSError *error;
    
    NSDictionary *wholeDict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
    

    
    allAbmunsArray = [wholeDict objectForKey:@"results"];
    
    for(NSDictionary *currentAlbum in allAbmunsArray)
    {
        NSLog(@"Artist: %@", [currentAlbum objectForKey:@"artist_name"]);
        
        for(allTracks in [currentAlbum objectForKey:@"tracks"])
        {
            //NSLog(@"Titel: %@",[allTracks objectForKey:@"title"]);
        }
        
        
    }
    
}


-(NSData *)getJSONData
{
    NSURL *url = [I]{rausgenommen}[/I]
    
        
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:url];
    [request setHTTPMethod:@"POST"];
   
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    
    //[request setHTTPBody:postData];
    
    NSError *error;
    NSURLResponse *response;
    
    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
  
    return urlData;
}



#pragma mark - Cover Data Tramsmission

-(void)prepareCoverDataForRequest
{
    
    
    for (int i=1; i<=15; i++)
    {
    
        NSURL * url = [I]{rausgenommen}[/I]
        
        
        
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:url];
        [request setHTTPMethod:@"POST"];
        [request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
    
        NSError *error;
        NSURLResponse *response;
    
        NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]
    
        [coverArray addObject:[UIImage imageWithData:urlData]];
        
    }
    
}
@end

Jetzt der destinationViewController (keine Kennzeichnung)
Code:
//
//  TracklistTableViewController.m
//  SimfyProject
//
//  Created by Christian Mansch on 10.12.12.
//  Copyright (c) 2012 Christian Mansch. All rights reserved.
//

#import "TracklistTableViewController.h"
#import "TracklistCell.h"
#import "Tracklist.h"

@interface TracklistTableViewController ()

@end

@implementation TracklistTableViewController
@synthesize allTracks;
@synthesize testString;

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

-(void)initTracklist:(NSArray *)tracks
{
    allTracks = tracks;
    NSLog(@"String: %@",testString);
}

- (void)viewDidLoad
{
    [super viewDidLoad];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"allTracks: %@",allTracks);  //Ist null
    NSLog(@"TestString: %@", testString); //Ist null
    return 2;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    TracklistCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tracklistCell"];

    NSLog(@"Tracks count %i", [allTracks count]);
    // Configure the cell...
    
    cell.trackNumber.text = [[[allTracks objectAtIndex:indexPath.row] objectForKey:@"track_number"] stringValue];
    //cell.trackNumber.text = testString;
    cell.trackTitle.text = [[allTracks objectAtIndex:indexPath.row] objectForKey:@"title"];
    cell.length.text = [[[allTracks objectAtIndex:indexPath.row] objectForKey:@"length"] stringValue];
    return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     */
}

@end
 
Es ist immer ganz hilfreich, solche Projekte auf github zu packen. Dann können wir alle uns das Problem am lebenden Objekt ansehen

Alex
 
Hallo zusammen,
das Problem ist mittlerweile gelöst, habe einen Kollegen gefragt der sich damit gut auskannte. ich hatte den Segue falsch gesetzt und dann musste ich noch
Code:
performSegueWithIdentifier
aufrufen.

Ich habe mittlerweile ein anderes problem, ich schreib das hierrein weil ich keinen neuen Thread aufmachen wollte:
Bei den Tracks gibt es ja auch eine Spieldauer, die kann ich auslesen aber die Zeit steht da nur in sekunden. Wie kann ich
die jetzt richtig in Minuten umwandeln? Einfach druch 60 teilen geht nicht, da kommt was falschen bei raus.
Da muss ich mit dem DateFormatter etwas machen oder?

Ich hab mal folgendes ausprobiert:
Code:
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"mm:ss"];
    NSDate *myDate = [dateFormatter dateFromString:@"199"];
    NSLog(@"myDate is: %@",myDate);
aber myDate ist dann nil. oder bei anderen Angaben bekomme ich völlig falsche werte.
Wie mache ich das denn richtig?

EDIT: Oh man da war ich aber auf dem Holzweg.
hier ein Beispiel für die Nachwelt:
Code:
int time=610;
    
    int seconds = time%60;
    
    int minutes = ((time-seconds)/60)%60;

    NSLog(@"Minutes: %d - Seconds: %d",minutes, seconds);
 
Zuletzt bearbeitet: