UIPickerView: Fehlermeldung bei Werten

cropfaktor

cropfaktor

Aktives Mitglied
Thread Starter
Dabei seit
18.01.2008
Beiträge
1.148
Reaktionspunkte
119
Hi,


Ich möchte etwas Triviales erreichen: Meinen UIPickerView mit Werten belegen. Die mir vorliegende Buchbeispiele tun dies, indem Sie einfach die Column-Anzahl in einer Art Schleife als Belegungswert wählen. Wie immer: Schwachsinn und jenseits der Praxis.

Also habe ich in der Headerdatei mal ein Array angelegt:
NSArray *projektArtenArray;

Code:
Bei - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Initialisiere ich es und fülle es mit Werten:

Code:
//Array Projektarten füllen
    projektArtenArray = [NSArray arrayWithObjects:@"Access-Datenbank", @"Office-VBA", nil];
    [projektArtenArray retain];
    [projektArtenArray autorelease];


Nun dachte ich, dass ich so den Picker füllen könnte:
Code:
//Zur Anzeige auf den Segmenten
- (NSString *)pickerView:(UIPickerView *)pickerView
             titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    
    NSString *projektName;
    projektName = [projektArtenArray objectAtIndex:row];
    NSLog(@"Projektname: %@", projektName);
    
    return [NSString stringWithFormat:@"%@",projektName];
}

Jo, funktioniert auch, nur dass ich, sowie ich das PickerView-Steuerelement auch nur berühre ein "Thread 1: Program received signal: "EXC_BAD_ACCESS" erhalte.

???

Jemand einen Tipp für mich?


Danke
Andreas
 
Also habe ich in der Headerdatei mal ein Array angelegt:
D.h., dass Du auch einen Setter erstellt hast?

Code:
//Array Projektarten füllen
    projektArtenArray = [NSArray arrayWithObjects:@"Access-Datenbank", @"Office-VBA", nil];
    [projektArtenArray retain];
    [projektArtenArray autorelease];

Schreibe:

Code:
self.projektArtenArray = [NSArray arrayWithObjects:@"Access-Datenbank", @"Office-VBA", nil];
Das self besagt, dass -setProjektArtenArray: aufgerufen wird.
Dein property muss im Header retain (oder wenn gewünscht copy) sein.

Da liegt Dein Problem… den projektArtenArray existiert nicht mehr, wenn Du es verwenden willst.
Deshalb bekommst Du dann Dein EXC_BAD_ACCESS.

Viele Grüße
 
  • Gefällt mir
Reaktionen: cropfaktor
Manchmal :hamma:

[projektArtenArray release]; in der Methode "dealloc" und hinfort bößes "Autorelease".

Noch eine Interessenfrage, ich bin wahrscheinlich zu doof es zu finden:
Im Apfelbeispielprojekt "UICatalog" gibt es einen Picker, der Werte wie "Chris Armstrong" etc. anzeigt. Wo kommen die her :confused:
Ich könnte die Suche benutzen, raffe aber nicht, wie man im gesamten Projekt suchen kann. Geht das überhaupt?

Danke für Tipps
Andreas
 
@little_pixel
Danke Dir für die Infos, es geht zwar mit dem "release", ich werde aber Deine Idee auch gleich probieren.

Danke
Andreas
 
ich werde aber Deine Idee auch gleich probieren.
Ist doch nicht meine Idee, sondern so wie man es "richtig" macht.
Klar, man kann auch den manuellen Weg der Speicherverwaltung gehen (der ab und an gewünschte Vorteile) bietet, aber für Anfänger ist der Umgang mit Properties doch sehr vorteilhaft.

Viele Grüße
 
"aber für Anfänger ist der Umgang mit Properties doch sehr vorteilhaft."
Ist es dass?

2 Bücher durch und von
"Das self besagt, dass -setProjektArtenArray: aufgerufen wird.
Dein property muss im Header retain (oder wenn gewünscht copy) sein."
steht da nirgends zu lesen.

Ich frage mich, wie man an solche Infos kommt. Null Ahnung, was Du damit meinst.

Seufz
Andreas
 
Dein property muss im Header retain (oder wenn gewünscht copy) sein."
steht da nirgends zu lesen.
Wenn dem wirklich so wäre, dann lehne ich mich weit aus dem Fenster und sage: Schmeiß sie weg und hole was Richtiges.
Aber ich kann mir das fast nicht vorstellen…

.h:
Code:
#import <Cocoa/Cocoa.h>

@interface MyClass : NSObject
{

    @public

    @private

    NSArray *list;

}

@property (readwrite, retain) NSArray *list;

@end

.m:
Code:
#import "MyClass.h"

@implementation MyClass

@synthesize list;

-(void)dealloc
{

    self.list = nil;

}

@end

So sieht eine Klasse mit einer Eigenschaft aus.

Überall in der Klasse verwendest Du die Zuweisung mit "self.list = …" nicht "list = …".

Für Dich zu lesen gibt es dann zu den Schlagwörtern:
-retain, copy, assign, -init, -initWith…, -dealloc, was ist ein Setter ( -setList:), was ist ein Getter (-list).

Mit diesen Sachen solltest Du Dich vertraut machen. Das sind die Grundlagen zu Cocoa/Objective-C.
Wenn Du sie noch nicht verstehst (was am Anfang normal ist), dann solltest Du einfach stur nach obigem Vorgehen handeln.

Viele Grüße
 
  • Gefällt mir
Reaktionen: cropfaktor
Danke Dir. Buch "Ingo Böhme: iPhone & iPad Programmierung für Einsteiger" ist soeben in den Müll gewandert. War sowieso voller Fehler.

Heute ist eh Theorietag und da geht es jetzt 10 Stunden lang zur Sache.

Viele Grüße
Andreas
 
Habe nachgesehen: Steht aber drin!

Viele Grüße
 
Seite 282 + 283.

P.S.: Dass selbst Profis da Schwierigkeiten haben, zeigt sich mir hier:
Das sind doch keine Schwierigkeiten, sondern eine Erklärung.

Das Ganze ist aber mit Vorsicht zu geniessen:

NSString *string=[NSString stringWithString:mad:"Totalegal"]; // Hier findet kein alloc statt, also brauche ich auch kein release
Er weiß was er dort macht, aber für Anfänger ist das ziemlich ungünstig ausgedrückt.
Nach dem = steht nämlich die verkürzte Version von -alloc -init -autorelease.

Lese Dir doch am Besten mal von Apple MM durch: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

Viele Grüße
 
  • Gefällt mir
Reaktionen: cropfaktor
Du bist Klasse und hast mir sehr gut geholfen.
Herzlichen Dank dafür.

Bin fleißigst am lesen und Durcharbeiten!

Viele Grüße
Andreas
 
Zurück
Oben Unten