2011-01-11 8 views
0

für die letzten paar Wochen bin ich endlich in Obj-C von regulär C gekommen und habe meine erste App gestartet. Ich habe mir Tutorials angesehen und ein Buch mit vielen Webseiten durchgelesen, aber ich weiß, dass ich gerade erst angefangen habe. Jedenfalls habe ich den größten Teil der Nacht und heute Morgen versucht, diesen Code zum Laufen zu bringen, und jetzt, wo er kompiliert wird, habe ich ein paar Warnungen. Ich habe ähnliche Probleme mit Lösungen gesucht und gefunden, aber immer noch keine Würfel. Was ich versuche, ist ein Array aus einem TXT-Dokument in die Popup-Liste in einem Kombinationsfeld."'Objekte' reagieren möglicherweise nicht auf 'Funktionen'" Warnungen

AwesomeBoxList.h:

#import <Cocoa/Cocoa.h> 
@interface AwesomeBoxList : NSObject 
{ 
    IBOutlet NSComboBox *ComboBoz; 
} 
-(NSArray *) getStringzFromTxtz; 
- (void) awesomeBoxList; 
@end 

AwesomeBoxList.m:

#import "AwesomeBoxList.h" 

@implementation AwesomeBoxList 

-(NSArray *)getStringzFromTxtz 
{ 
... 
return combind; 
} 

- (void) awesomeBoxList 
{ 
[ComboBoz setUsesDataSource:YES]; 


[ComboBoz setDataSource: 

[ComboBoz getStringzFromTxtz]: //'NSComboBox' may not respond to 'getStringzFromTxtz' 

[ComboBoz comboBox:(NSComboBox *)ComboBoz objectValueForItemAtIndex: 

[ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]]]; 


     /*'NSComboBox' may not respond to '-numberOfItemsInComboBox:' 
    'NSComboBox' may not respond to '-comboBox:objectValueForItemAtIndex:' 
    'NSComboBox' may not respond to '-setDataSource:' 
    */ 
} 

@end 

Also, mit all dieser Fehler und meine noch seicht Kenntnisse Obj-C, ich muss eine Art werden machen von n00b Fehler.

Danke für die Hilfe.

Antwort

1

Es scheint hier in der Regel eine große Menge an Verwirrung zu herrschen, die sich hauptsächlich in der letzten (4) Codezeile (n) äußert ( ). Sie wissen, dass das ':' - Symbol verwendet wird, um Argumente an Methoden zu übergeben, nicht um eine Zeile zu beenden? Sie verketten die letzten 4 Zeilen im Wesentlichen in einer Weise, die keinen Sinn ergibt. Was die spezifischen Warnungen betrifft, ist getStringzFromTxtz eine Methode, die Sie in AwesomeBoxList definiert haben, keine Methode von NSComboBox. numberOfItemsInComboBox: und comboBox: objectValueForItemAtIndex: sind NSComboBoxDataSource Protocol Methoden, bestimmt durch Ihre Klasse im Auftrag eines NSComboBox umgesetzt werden, nicht NSComboBox Methoden. Ich würde empfehlen, ein wenig über Delegierte und Protokolle zu lesen.

Um zu präzisieren: Damit Ihre AwesomeBoxList-Klasse ein NSComboBox verwenden kann, muss sie Informationen zu dem Kombinationsfeld bereitstellen, das das Kombinationsfeld benötigt. Im Apple Universum werden solche Situationen normalerweise mit der Delegate Design Pattern behandelt. Insbesondere muss das Kombinationsfeld , wie viele Elemente wissen, dass es sowie die Objektdarstellung für jede der gezeigten Elemente zeigen. Das Kombinationsfeld deklariert die Schnittstelle dafür in NSComboBoxDataSource Protocol. Wenn Sie diese Informationen bereitstellen, fungieren Sie als Datenquelle für das Kombinationsfeld. Sie können die Combo-Box sagen, dass es, indem Sie sich als seine Eigenschaft datasource im Interface Builder oder mit einem Aufruf an

[ComboBoz setDataSource:self]; 

von irgendwo in Ihrer AwesomeBoxList-Implementierung für seine Daten zu Ihrer Klasse verschieben sollte. Dadurch wird sichergestellt, dass das Kombinationsfeld Methoden in Ihrer Klasse aufruft, um sich mit Informationen zu füllen. Es gibt zwei Methoden spezifisch, dass Ihre AwesomeBoxList Klasse sollte implementieren, und die von dem Kombinationsfeld aufgerufen werden:

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index { 
    switch (index) { 
     // Return some object that is represented by index in the combo box 
    } 
} 

- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox { 
    // return theNumberOfItemsInYourComboBox; 
} 

eine sinnvolle Umsetzung Providing ist alles, was Sie tun müssen, um Ihre Combo-Box mit Daten zu füllen. Ich weiß nicht genau, was du hier willst, aber das ist das Muster, dem du folgen willst. Hoffe das hilft ein bisschen mehr.

+0

Ja, ich kenne den Unterschied zwischen ';' und ':', die Dokumentation besagt, dass Sie comboBox: objectValueForItemAtIndex: und numberOfItemsInComboBox verwenden müssen: setDataSource :, und ich bemerke, dass die zweite Methode einen int zurückgibt und der erste einen int, also dachte ich, dass sie so zusammenpassen . Sie haben Recht damit, dass ich mehr über Delegaten und Protokolle wissen muss, da das NSComboBoxDataSource-Protokoll informell ist, wie verwende ich es, damit diese Methoden funktionieren? Danke für die Hilfe. – Andrew

+0

@Andrew, Okay, ich dachte, dass, von C kommend, Sie Semikolons kennen, aber ich habe seltsame Dinge gesehen =). Diese Delegate-Methoden sind schnell Methoden, die Ihre Klasse implementieren sollte, und keine Methoden, die von der NSComboBox implementiert werden. Ich habe in meiner bearbeiteten Antwort ausgearbeitet. –

0

Nun wird die getStringzFromTxtz nicht auf eine NSComboBox Instanz gesendet Arbeit, die wie die Methode deklariert und in Ihrer AwesomeBoxList Klasse definiert. Diese Methode wird zur Laufzeit nicht gefunden.

Außerdem glaube ich, können Sie Ihren Kopf um die Delegierten und Datenquellen erhalten müssen - die anderen Methoden Teil des NSComboBoxDataSource Protokoll sind. Sehen Sie sich das Kombinationsfeld Programmierungshandbuch in der Dokumentation für Beispiele an.

0

Diese Methoden existieren nicht. See the NSComboBox documentation for more information.

Statt:

 
[ComboBoz 
comboBox:(NSComboBox *)ComboBoz 
objectValueForItemAtIndex:[ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]]; 

Versuchen:

 
[[comboBox objectValues] objectAtIndex:[comboBox numberOfItems] - 1]; 

Beachten Sie auch, dass die Plattform-Konvention ist ein Kleinbuchstaben am Anfang eines Ivar zu verwenden.

Verwandte Themen