2009-03-28 18 views
12

Czy ktoś może zaproponować kilka linków do używania UITextField w cocos2d. Chcę nacisnąć na etykietę, a następnie wybrać opcję UITextField i potrzebuję edytować na tej UITextField.Przykład UITextField w Cocos2d

Odpowiedz

15

Robię to w bieżącym projekcie, aby umożliwić wprowadzenie liczby poziomów do rozpoczęcia gry, dlatego moje zmienne i metody są nazywane takimi, jakimi są; prawdopodobnie powinieneś dostosować te ustawienia, by nadać im sens.

W kontrolerze aplikacji, określić to jako zmiennej instancji:

UITextField *levelEntryTextField; 

Tworzenie go wewnątrz applicationDidFinishLaunching:

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

Zdefiniować metodę aktywacji w polu tekstowym. Powinieneś również zadeklarować go w pliku nagłówkowym kontrolera aplikacji.

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

To sprawi, naciskając przycisk „powrót” w edycji końcowej klawiatura

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

ten jest wyzwalany, gdy edycja jest faktycznie wykonywana.

- (void)textFieldDidEndEditing:(UITextField*)textField { 
    if (textField==levelEntryTextField) { 
     [levelEntryTextField endEditing:YES]; 
     [levelEntryTextField removeFromSuperview]; 
     // here is where you should do something with the data they entered 
     NSString *result = levelEntryTextField.text; 
    } 
} 

Teraz, aby faktycznie uruchomić ruch, umieszczasz to gdzieś. Ja nazywam to od wewnątrz jednego z moich zajęć tematycznych, w odpowiedzi na działania użytkownika:

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

hej, próbowałem ten sposób, ale tylko pokazuje się klawiatura. nie widziałem pola tekstowego – OMGPOP

+1

Spróbuj [textBox setTextColor: [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 1.0]]; [textBox setBackgroundColor: [UIColor colorWithRed: 255 green: 255 blue: 255 alpha: 1.0]]; – RSH1

+0

co to jest 'window' w' specifyStartLevel'? ok dla tych prawdziwych początkujących jest to okno '[[[widok [CCDdirectorDirector]]]. – Claudiu

10

Wziąłem przykład, że Jack dostarczonego i faktycznie stworzyli projekt roboczy, to było zrobione za pomocą szablonu XCode Cocos2d 0.7.1 , a następnie edycję plików * AppDelegate.m/.h, które są podane poniżej w całości. Zmodyfikowałem także część tego, co powiedział Jack, ponieważ uważam, że utworzenie UITextField w appDidFinishLoading zużywa nieco za dużo pamięci, szczególnie jeśli pole tekstowe nie jest używane przez cały czas ... to rozwiązanie tworzy pole tekstowe tylko wtedy, gdy jest jest potrzebny, próbka rysuje pustą scenę Cocos2D Layer, a na ekranie dotykowym wyświetla pole tekstowe, w którym możesz rozpocząć wprowadzanie tekstu. Wypluje wynik tego, co wprowadziłeś do Konsoli - możesz przekazać to, co jest konieczne w twoim własnym kodzie.

.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 

a następnie .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

dzięki bro. nice done – OMGPOP

+0

Powinno to być okno [[[[CCD director sharedDirector] openGLView]] addSubview: myText]; w miejsce okna [[[[director sharedDirector] openGLView]] addSubview: myText]; –

0

Spróbuj następujące podklasy CCNode, CCMenuItemTextField, używać pól tekstowych w Cocos2d.

Klasa jest bezpośrednio podklasowana z CCMenuItemSprite. Po dotknięciu wywoływana jest "wybrana" metoda, a do głównego okna dodawany jest UITextField. Po zakończeniu edycji, wywoływana jest metoda "niewybraną", a ekran UITextField jest usuwany z ekranu. Wprowadzane przez użytkownika dane są zapisywane w węźle CCLabelTTF, który jest dokładnie taki sam, jak oryginalny UITextField.

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

Z jakiej wersji Cocos2D korzystałeś? Wydaje się, że nie działa bezpośrednio z v1.1. –

2

Aby dodać pole tekstowe w Cocos2d jak poniżej kod

przede wszystkim dodać widok na scenę i afetr doda tekstowym dodać w widoku ów bardzo łatwe.

-(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; 
} 

można również użyć CCTextfield w Cocos2d Najlepszym przykładem jest https://github.com/iNinja/CCTextField