Frage

Ich habe nur sprang in Objective-C und ich habe ziemlich früh aufgeklebt. Ich werde Code mit meiner Frage posten, aber zu halten es lesbar i von einigen der Mist loswerden werden, lassen Sie mich wissen, wenn Sie mehr Code geschrieben wollen!

Ich habe ein neues Objekt namens ‚Phrase‘ (subclassed von NSObject) erstellt, und mir Elemente aus JSON in diese ‚Phrase‘ Objekte und das Hinzufügen von ihnen zu einem Array zu lesen. Hier ist die erste Menge Code:

Beispiel JSON:

    {
    "phrases": [
        {
            "title": "Title of my Phrase",
         "definition" : "A way to look at some words",
   "location" : "Irish Proverb"
        }   
    ]
    }

Skript lese ich es mit:

    - (void)viewDidLoad {
    [super viewDidLoad];

 self.phraseDictionary = [[NSMutableArray alloc] initWithObjects:nil];

 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"phrase" ofType:@"json"];  
 NSString *myRawJSON = [[NSString alloc] initWithContentsOfFile:filePath];

 NSData *jsonData = [myRawJSON dataUsingEncoding:NSUTF32BigEndianStringEncoding];
 NSDictionary *entries = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:nil];


 for (id key in entries) {

  NSObject *phrases = [entries objectForKey:key];

  for (id phrase in phrases) {

   Phrase *pushArrayToPhrase = [[Phrase alloc] initWithText:[phrase objectForKey:@"title"] definition:[phrase objectForKey:@"definition"] location:[phrase objectForKey:@"location"]];
   [self.phraseDictionary addObject:pushArrayToPhrase];

  }

    }
    }

Phrase m-Datei:

#import "Phrase.h"


@implementation Phrase

@synthesize title;
@synthesize definition;
@synthesize location;

- (id)init {
 self = [super init];
 if (self != nil) {
  title = @"";
  definition = @"";
  location = @"";
 }
 return self;
}

- (id)initWithTitle:(NSString *)tit definition:(NSString *)def location:(NSString *)loc {
 self = [super init];
 if (self != nil) {
  title = tit;
  definition = def;
  location = loc;
 } 
 return self;
}


@end

Von hier ich Schleife durch die Objekte und fügen Sie sie in eine Liste in meinem SPLITVIEW-:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 static NSString *CellIdentifier = @"CellIdentifier";

 // Dequeue or create a cell of the appropriate type.
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    Phrase *cellPhrase = [self.phraseDictionary objectAtIndex:indexPath.row];
 cell.textLabel.text = cellPhrase.title;
 return cell;
}

Aber wenn ich auf ein Element klicken, und fragen Sie nach einer Phrase auf der Grundlage des indexPath.row der eine geklickt hat, kann ich immer nur die Eigenschaft in der cell.textLabel.text verwendet zuzugreifen. Jeder andere Versuch von hier an, um Zugriff auf eine Eigenschaft aus der Phrase Objekt verlässt den Simulator.

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 Phrase *cellPhrase = [self.phraseDictionary objectAtIndex:indexPath.row];
 detailViewController.detailItem = cellPhrase;
 //If i attempt 'cellPhrase.definition' here, the app will close without an error

}

Hope, das einfach zu folgen, lassen Sie mich wissen, wenn es nicht und ich werde wieder versuchen!

War es hilfreich?

Lösung

In der initwithtitle Methode die Variablen zuweisen, aber behalten sie nicht. Wenn sie nicht überall gehalten werden, werden sie freigegeben werden und wenn Sie versuchen, zuzugreifen wird sie Ihre Anwendung zum Absturz bringen. Wenn Sie keine Fehlermeldungen werden immer sicherstellen, schalten Sie das Debuggen auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top