2009-03-28 10 views
12

Kann jemand bitte einige Links für die Verwendung von UITextField in cocos2d vorschlagen. Ich möchte auf Etikett drücken, dann sollte die UITextField ausgewählt werden und ich muss auf dieser UITextField bearbeiten.UITextField Beispiel in Cocos2d

Antwort

15

Ich mache das in einem aktuellen Projekt, um die Nummer des Levels einzugeben, mit dem ich anfangen soll zu spielen, deshalb werden meine Variablen und Methoden so benannt, wie sie sind; Sie sollten diese wahrscheinlich anpassen, um für Sie sinnvoll zu sein.

In Ihrer App Controller definieren dies als Instanzvariable:

UITextField *levelEntryTextField; 

erstellen es in applicationDidFinishLaunching:

levelEntryTextField = [[UITextField alloc] initWithFrame: 
               CGRectMake(60, 165, 200, 90)]; 
    [levelEntryTextField setDelegate:self]; 

eine Methode definieren Sie das Textfeld zu aktivieren. Sie sollten dies auch in der Header-Datei für Ihren App-Controller deklarieren.

- (void)specifyStartLevel 
{ 
    [levelEntryTextField setText:@""]; 
    [window addSubview:levelEntryTextField]; 
    [levelEntryTextField becomeFirstResponder];  
} 

Damit wird „Rückkehr“ auf der Tastatur Ende Bearbeitung

- (BOOL)textFieldShouldReturn:(UITextField*)textField { 
    //Terminate editing 
    [textField resignFirstResponder]; 
    return YES; 
} 

Drücken dieser ausgelöst wird, wenn die Bearbeitung tatsächlich durchgeführt wird.

Jetzt um tatsächlich Dinge in Bewegung zu setzen, setzen Sie dies irgendwo. Ich nenne dies aus einer meiner Szene Klassen, in Reaktion auf eine Benutzeraktion:

[[[UIApplication sharedApplication] delegate] specifyStartLevel]; 
+0

hey, ich habe versucht, auf diese Weise aber nur die Tastatur zeigt sich nutzen können. Ich habe das Textfeld nicht gesehen – OMGPOP

+1

Versuchen Sie [textBox setTextColor: [UIColor colorWithRed: 0 grün: 0 blau: 0 alpha: 1.0]]; [textBox setBackgroundColor: [UIColor colorWithRed: 255 grün: 255 blau: 255 alpha: 1.0]]; – RSH1

+0

Was ist 'Fenster' in' specifyStartLevel'? ok für diese echten Anfänger ist es '[[[[CCDorector sharedDirector] view] Fenster]'. – Claudiu

10

Ich nahm das Beispiel, das Jack zur Verfügung gestellt und tatsächlich ein funktionierendes Projekt geschaffen, das getan wurde die Cocos2D 0.7.1 XCode Vorlage verwenden und dann nur die * AppDelegate.m/.h Dateien, die unten in der Gesamtheit zur Verfügung gestellt werden. Ich habe auch etwas von dem geändert, was Jack gesagt hat, weil ich denke, dass das Erstellen des UITextField in der appDidFinishLoading ein wenig zu viel Speicher benötigt, besonders wenn das Textfeld nicht immer benutzt wird ... diese Lösung erzeugt das Textfeld nur dann Wenn das Sample benötigt wird, wird eine leere Cocos2D-Layerszene gezeichnet und auf dem Bildschirm wird das Textfeld angezeigt, in das Sie Text eingeben können. Es spuckt das Ergebnis dessen aus, was Sie in die Konsole eingegeben haben - Sie können dies an das weitergeben, was in Ihrem eigenen Code notwendig ist.

die .h

#import <UIKit/UIKit.h> 
#import "cocos2d.h" 
@interface MYSCENE : Layer <UITextFieldDelegate> 
{ 
    UITextField *myText; 
} 
-(void)specificStartLevel; 
@end 
@interface textFieldTestAppDelegate : NSObject <UIAccelerometerDelegate, UIAlertViewDelegate, UITextFieldDelegate, UIApplicationDelegate> 
{ 
    UIWindow *window; 
} 
@end 

und dann die .m

#import "textFieldTestAppDelegate.h" 
@implementation MYSCENE 
-(id) init 
{ 
    self = [super init]; 
    isTouchEnabled = YES; 
    return self; 
} 
-(BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self specifyStartLevel]; 
    return kEventHandled; 
} 
-(void)specifyStartLevel { 
    myText = [[UITextField alloc] initWithFrame:CGRectMake(60, 165, 200, 90)]; 
    [myText setDelegate:self]; 
    [myText setText:@""]; 
    [myText setTextColor: [UIColor colorWithRed:255 green:255 blue:255 alpha:1.0]]; 
    [[[[Director sharedDirector] openGLView] window] addSubview:myText]; 
    [myText becomeFirstResponder]; 
} 
-(BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [myText resignFirstResponder]; 
    return YES; 
} 
-(void)textFieldDidEndEditing: (UITextField *)textField { 
    if(textField == myText) { 
     [myText endEditing:YES]; 
     [myText removeFromSuperview]; 
     NSString *result = myText.text; 
     NSLog([NSString stringWithFormat:@"entered: %@", result]); 
    } else { 
     NSLog(@"textField did not match myText"); 
    } 
} 
-(void) dealloc 
{ 
[super dealloc]; 
} 
@end 
@implementation textFieldTestAppDelegate 
- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [window setUserInteractionEnabled:YES]; 
    [[Director sharedDirector] setDisplayFPS:YES]; 
    [[Director sharedDirector] attachInWindow:window]; 
    Scene *scene = [Scene node]; 
    [scene addChild: [MYSCENE node]]; 
    [window makeKeyAndVisible]; 
    [[Director sharedDirector] runWithScene: scene]; 
} 
-(void)dealloc 
{ 
    [super dealloc]; 
} 
-(void) applicationWillResignActive:(UIApplication *)application 
{ 
    [[Director sharedDirector] pause]; 
} 
-(void) applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[Director sharedDirector] resume]; 
} 
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
{ 
    [[TextureMgr sharedTextureMgr] removeAllTextures]; 
} 
@end 
+0

danke bro. nice done – OMGPOP

+0

Das sollte [[[[CCDirector sharedDirector] openGLView] Fenster] addSubview: myText]; anstelle von [[[[Director sharedDirector] openGLView] Fenster] addSubview: myText]; –

0

die folgende CCNode Unterklasse versuchen, CCMenuItemTextField, Textfelder in cocos2d zu verwenden.

Die Klasse ist direkt von CCMenuItemSprite abgeleitet. Beim Antippen wird die Methode "selected" aufgerufen und ein UITextField zum Hauptfenster hinzugefügt. Nach der Bearbeitung wird die Methode "unselected" aufgerufen und das UITextField vom Bildschirm entfernt. Die Benutzereingabe wird in einem CCLabelTTF-Knoten gespeichert, der sich genau wie das ursprüngliche UITextField positioniert.

CCMenuItemTextField.h

@interface CCMenuItemTextField : CCMenuItemSprite<UITextFieldDelegate> { 
    UITextField  *textField_; 
    CCLabelTTF  *label_; 

    CGFloat   paddingLeft_; 
} 

@property (readonly, nonatomic) UITextField  *textField; 
@property (readonly, nonatomic) CCLabelTTF  *label; 
@property (assign, nonatomic) CGFloat   paddingLeft; 

- (void)selected; 
- (void)unselected; 
- (void)setFontSize:(CGFloat)size; 

- (NSString*)text; 
- (void)setText:(NSString*)text; 

@end 

CCMenuItemTextField.m

#import "CCMenuItemTextField.h" 

@implementation CCMenuItemTextField 

@synthesize 
textField = textField_, 
label = label_, 
paddingLeft = paddingLeft_; 

- (id)init 
{ 
    CCSprite *normalSprite = [CCSprite spriteWithFile:@"text_field_background.png"]; 
    CCSprite *selectedSprite = [CCSprite spriteWithFile:@"text_field_background.png"]; 
    CCSprite *disabledSprite = [CCSprite spriteWithFile:@"text_field_background.png"]; 

    return [self initWithNormalSprite:normalSprite selectedSprite:selectedSprite disabledSprite:disabledSprite]; 
} 

- (id)initWithNormalSprite:(CCNode<CCRGBAProtocol> *)normalSprite 
      selectedSprite:(CCNode<CCRGBAProtocol> *)selectedSprite 
      disabledSprite:(CCNode<CCRGBAProtocol> *)disabledSprite 
{ 
    self = [super initWithNormalSprite:normalSprite 
         selectedSprite:selectedSprite 
         disabledSprite:disabledSprite 
           target:self 
           selector:@selector(selected)]; 

    if (self) { 
     paddingLeft_ = 3.0; 

     textField_ = [[UITextField alloc] init]; 
     [textField_ setTextColor:[UIColor blackColor]]; 
     [textField_ setFont:[UIFont systemFontOfSize:18]]; 

     label_ = [[CCLabelTTF node] retain]; 
     [label_ setAnchorPoint:ccp(0,0.5)]; 
     [label_ setFontSize:18]; 
     [label_ setVisible:NO]; 
     [label_ setColor:ccBLACK]; 
     [self addChild:label_]; 
    } 

    return self; 
} 

- (void)dealloc 
{ 
    [label_ release]; 
    [textField_ release]; 
    [super dealloc]; 
} 

// -------------------------------- 
// Public 
// -------------------------------- 

- (void)selected 
{ 
    [super selected]; 

    [label_ setVisible:NO]; 

    CGAffineTransform transform = [self nodeToWorldTransform]; 
    float textFieldHeight = textField_.font.lineHeight; 
    float width = self.contentSize.width; 
    float height = self.contentSize.height; 
    float left = transform.tx + paddingLeft_; 
    float top = 480 - transform.ty - height + (height - textFieldHeight)/2; 

    [textField_ setFrame:CGRectMake(left, top, width, height)]; 
    [[[[CCDirector sharedDirector] view] window] addSubview:textField_]; 
    [textField_ becomeFirstResponder]; 
    [textField_ setDelegate:self]; 
} 

- (void)unselected 
{ 
    [super unselected]; 

    [label_ setVisible:YES]; 
    [label_ setPosition:ccp(paddingLeft_, self.contentSize.height/2)]; 

    NSString *text = textField_.text ? textField_.text : @""; 
    [label_ setString:text]; 

    [textField_ resignFirstResponder]; 
    [textField_ removeFromSuperview]; 
} 

- (NSString*)text 
{ 
    return [label_ string]; 
} 

- (void)setText:(NSString*)text 
{ 
    [label_ setString:text]; 
    [textField_ setText:text]; 
} 

// -------------------------------- 
// UITextFieldDelegate 
// -------------------------------- 

- (BOOL)textFieldShouldReturn:(UITextField*)textField { 
    [self unselected]; 
    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField*)textField { 
    [self unselected]; 
} 

- (void)setFontSize:(CGFloat)size 
{ 
    [label_ setFontSize:size]; 
    [textField_ setFont:[UIFont systemFontOfSize:size]]; 
} 

// -------------------------------- 
// CCNode 
// -------------------------------- 

- (void)onExitTransitionDidStart 
{ 
    [super onExitTransitionDidStart]; 
    [self unselected]; 
} 

@end 
+1

Welche Cocos2d Version hast du benutzt? Es scheint nicht direkt mit v1.1 zu funktionieren. –

2

Um Textfeld in cocos2d wie unten Code

allererst hinzufügen Sie Ansicht in Szene und afetr Add Textfeld in Sicht, das ist sehr einfach hinzufügen.

-(id) init 
{ 
    if((self=[super init])) 
    { 

     // add view in scene 

     UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)]; 
     view.backgroundColor = [UIColor redColor]; 

    // add textfield in view 

     UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 140, 300, 30)]; 
     textField.borderStyle = UITextBorderStyleRoundedRect; 
     textField.font = [UIFont systemFontOfSize:15]; 
     textField.placeholder = @"enter text"; 
     textField.autocorrectionType = UITextAutocorrectionTypeNo; 
     textField.keyboardType = UIKeyboardTypeDefault; 
     textField.returnKeyType = UIReturnKeyDone; 
     textField.clearButtonMode = UITextFieldViewModeWhileEditing; 
     textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
     textField.delegate = self; 
     [view addSubview:textField]; 

    // add view in scene 

     [[[CCDirector sharedDirector] view] addSubview:view]; 
} 
    return self; 
} 

Sie auch CCTextfield in cocos2d beste Beispiel ist https://github.com/iNinja/CCTextField