Quantcast
Channel: Martin Öhman : m-ohman.se » Objective-C
Viewing all articles
Browse latest Browse all 2

UITextField i UITableView cell som firstResponder

$
0
0

I systeminställningarna på iPhonen finns det fält med en rubrik och ett textfält. T.ex för inställningar av namn och liknande information. Direkt man trycker på cellen så aktiveras textfältet och man kan editera innehållet. Hur gör man det?

För att TableViewCellerna ska se ut som i systeminställningarna krävs det att UITableViewController initialiseras med grupperad stil ( UITableViewStyleGrouped ).

  1. /* Säg att vi har skapat en ny TableViewController som består av filerna TVController.m / TVController.h */
    TVController *tvc = [[TVController alloc] initWithStyle:UITableViewStyleGrouped];
    // initialiserar med UITableViewStyleGrouped för att få den grupperade stilen som i systeminställningarna
    [self presentModalViewController:tvc animated:YES];
    // tar up tvc som en ModalViewController
    

För att något skall visas i tabellen behöver vi editera TVController.m.

  1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 2;
        // 2 st rader som exempel ..
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    /*
    .. standard kod
    */
    
    // Set up the cell...
    cell.textLabel.text = @"SomeSetting";
    cell.textLabel.font = [[UIFont boldSystemFontOfSize:15] retain];
    // lite styling av labeltexten
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    // nödvändigt för att cellen inte ska bli markerad när användaren trycker på den
    
    CGRect rect = CGRectMake(110,11,190,40);
    // en rect för att placera ut textfältet
    UITextField *textfalt = [[UITextField alloc] initWithFrame:rect];
    // initWithFrame använder den nyss skapade CGrect som frame
    [textfalt setDelegate:self];
    [textfalt setAutocapitalizationType:UITextAutocapitalizationTypeNone];
    // om man inte vill att den första bokstaven automatiskt ska göras om till stor bokstav
    [textfalt setAutocorrectionType:UITextAutocorrectionTypeNo];
    // om man inte vill att spellcheck ska vara aktiverat
    [cell addSubview:textfalt];
    // lägger till textfältet som subview i cellen
    [textfalt release];
    return cell;
    }
    

Nu kan man köra applikationen och det ska se rätt ut. Däremot så går det inte att trycka på t.ex texten i en cell för att aktivera textfältet. För att det skall fungera behöver vi göra såhär:

  1. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    for (UITextField *view in [tableView cellForRowAtIndexPath:indexPath].subviews) {
        [view becomeFirstResponder];
        /* Loopar igenom cellens subviews och sätter subviews som är UITextField till FirstResponder, dvs flyttar pekaren dit och aktiverar tangentbordet. Det finns självklart andra sätt att göra detta på, man hade t.ex kunnat göra en custom cell och sedan haft en metod för att göra textfältet i cellen till FirstResponder. Men det här funkar bra i det här scenariot iaf. */
        }
    }
    

Inte ett komplett exempel men de viktigaste bitarna är där.


Viewing all articles
Browse latest Browse all 2