iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   Toetsenbord wil niet verbergen (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/110021-toetsenbord-wil-niet-verbergen.html)

Jeroen0704 18-01-12 20:05

Toetsenbord wil niet verbergen
 
Hallo,

Ik heb een grouped tableview met in de 1e cell een textfield. Het ziet er zo uit:

http://img805.imageshack.us/img805/3693/img0336s.png

Als je op cancel of settings drukt ga je terug naar de rootviewcontroller. Dit werkt allemaal tot nu toe. Ik wil echter ook dat het toetsenbord dan verdwijnt, maar dat wil niet lukken. Ik gebruik de volgende code:

Code:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
   
    [theTextfield becomeFirstResponder];

}

Code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   
    static NSString *CellIdentifier = @"Cell";
   
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
       
        if ([indexPath section] == 0) {
           
            if ([cell.contentView.subviews count] == 0) {
                theTextfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 460, 25)];
                theTextfield.returnKeyType = UIReturnKeyDone;
                theTextfield.enablesReturnKeyAutomatically = YES;
                theTextfield.clearButtonMode = UITextFieldViewModeWhileEditing;
                theTextfield.tag = 12;
                theTextfield.placeholder = @"Message";
                theTextfield.delegate = self;
                [theTextfield canResignFirstResponder];
                [theTextfield addTarget:self action:@selector(doneTyping) forControlEvents:UIControlEventEditingDidEndOnExit];
               
                [cell.contentView addSubview:theTextfield];
            }
        }

    }
   
    // Configure the cell...
   
    if ([indexPath section] == 0) {
             
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
       

    } else {
        cell.textLabel.text = @"Default";
        cell.textLabel.textAlignment = UITextAlignmentCenter;
    }
       
    return cell;
}

Code:

- (IBAction)cancel:(id)sender
{
    cancelButtonClicked = YES;
   
    [theTextfield resignFirstResponder];
   
    [self.navigationController popViewControllerAnimated:YES];
   
}

Ik hoop dat iemand me kan helpen.

Groeten,
Jeroen

wubbe 19-01-12 21:58

In je .h file moet je vermelden dat je het <UITextFieldDelegate> protocol implementeert en je voegt deze methoden toe:
Code:

- (BOOL) textFieldShouldReturn:(UITextField *)theTextField {
        [theTextField resignFirstResponder];
        return YES;
}

- (IBAction) textFieldDoneEditing:(id)sender {
        [sender resignFirstResponder];
}


Jeroen0704 19-01-12 22:02

Dat heb ik al geprobeerd, maar helaas werkte het niet.
Ik heb na een lange tijd het internet doorgespeurd te hebben het probleem gevonden. Ik heb namelijk een navigation controller als form sheet en op de een of andere manier laat Apple het dan niet toe om het toetsbord te verbergen met de resignFirstResponder functie.

Ik heb het probleem dus gevonden, helaas nog geen oplossing.

wubbe 19-01-12 22:10

Hoe heb jij 'theTextField' gedeclareerd?
Zo?
Code:

UITextField <UITextFieldDelegate> * theTextField;

Jeroen0704 19-01-12 22:15

Nee, zo:


Code:

@interface TwitterMessageViewController: UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate>
{
    UITextField *theTextfield;
    IBOutlet UITableView *theTableVuew;
   
    UIBarButtonItem *cancelButton;
    BOOL cancelButtonClicked;


}
@property (nonatomic, retain) UITextField *theTextfield;


@end


wubbe 19-01-12 22:20

Wijzig de property declaratie eens in:
Code:

@property (nonatomic, retain) UITextField <UITextFieldDelegate> * theTextfield;
(trouwens, in cellForRowAtIndexPath vergeet je
Code:

[theTextField release];
)

Jeroen0704 19-01-12 22:22

Ik zal het eens proberen!

Ik release theTextField trouwens ook in de dealloc en de viewDidUnload methoden, moet het dan ook in de cellForRowAtIndexPath?

wubbe 19-01-12 22:26

Citaat:

Oorspronkelijk geplaatst door Jeroen0704 (Bericht 761696)
Ik zal het eens proberen!

Ik release theTextField trouwens ook in de dealloc en de viewDidUnload methoden, moet het dan ook in de cellForRowAtIndexPath?

Niet ook. Alleen daar.

Hou dit als regel aan: "Als je een object alloceert en je hebt deze object referentie niet meer nodig dan moet je (liefst in dezelfde methode) het object weer releasen". Beetje kromme zin maar je begrijpt het denk ik wel.

Jeroen0704 19-01-12 22:28

@Wubbe

Het werkt helaas niet..

wubbe 19-01-12 22:36

Laatste poging. waarom heb je:
Code:

[theTextfield addTarget:self action:@selector(doneTyping) forControlEvents:UIControlEventEditingDidEndOnExit];
Dat is (volgens mij) niet nodig

Jeroen0704 19-01-12 22:39

Citaat:

Oorspronkelijk geplaatst door wubbe (Bericht 761702)
Niet ook. Alleen daar.

Hou dit als regel aan: "Als je een object alloceert en je hebt deze object referentie niet meer nodig dan moet je (liefst in dezelfde methode) het object weer releasen". Beetje kromme zin maar je begrijpt het denk ik wel.

Ik begrijp je wel inderdaad ;) Ik gebruik hem echter nog wel om te kijken hoe lang te tekst is, maar dit kan ik dan beter doen door de tag van de textfield en de cell neem ik aan?

---------- Bericht automatisch samengevoegd op 19 januari 2012 om 22:41 ----------

Citaat:

Oorspronkelijk geplaatst door wubbe (Bericht 761715)
Laatste poging. waarom heb je:
Code:

[theTextfield addTarget:self action:@selector(doneTyping) forControlEvents:UIControlEventEditingDidEndOnExit];
Dat is (volgens mij) niet nodig

Met:

Code:

- (BOOL) textFieldShouldReturn:(UITextField *)theTextField {
        [theTextField resignFirstResponder];
        return YES;
}

is het inderdaad niet nodig, maar ik wil er uiteindelijk een "done" button van maken en als je daarop klikt ook meteen terug gaan naar het "hoofd-settings" menu.

wubbe 19-01-12 22:41

Hoe kijk je hoe lang de tekst is?

Ah, daarvoor wil je de tag gebruiken! Dan kun je hem net zo goed inderdaad in de dealloc pas releasen en gewoon gebruiken.

Jeroen0704 19-01-12 22:44

Code:

- (NSString *) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
    if (section == 0)
    {
        if ([theTextfield.text length] > 0) {
            return [NSString stringWithFormat:@"Listened to: title - artist %@", theTextfield.text];
        } else {
            return [NSString stringWithFormat:@"Listened to: title - artist"];
        }
     
    } else {
        return nil;
    }
}



---------- Bericht automatisch samengevoegd op 19 januari 2012 om 22:45 ----------

En hier ook nog in de cellForRowAtIndexpath: methode:


Code:

if ([theTextfield.text length] == 0) {
            cell.detailTextLabel.text = [NSString stringWithFormat:@"0/30"]; 
        } else {
            cell.detailTextLabel.text = [NSString stringWithFormat:@"%.0u/30", [theTextfield.text length]]; 
        }
       
        if ([theTextfield.text length] > 30)
        {
            [self.navigationItem setHidesBackButton: YES animated: YES];
            cell.detailTextLabel.textColor = [UIColor colorWithRed:((1.0/255)*218) green:((1.0/255)*0) blue:((1.0/255)*0) alpha:1.0];

        } else {
            [self.navigationItem setHidesBackButton: NO animated: YES];
            cell.detailTextLabel.textColor = [UIColor colorWithRed:(1.0/255)*79 green:(1.0/255)*97 blue:(1.0/255)*146 alpha:1.0];


        }


wubbe 19-01-12 22:48

ik snap 'm. Nou, ik heb je dus helaas niet kunnen helpen :(. Succes verder.

Jeroen0704 19-01-12 22:50

Dankjewel! en bedankt voor je hulp!


Alle tijden zijn GMT +2. Het is nu 19:25.