2009-12-18 3 views
0

У меня есть небольшая проблема с отставкой клавиатуры. У меня есть таблица с двумя разделами. Во втором разделе я загружаю класс stationenStartCellNumber, который имеет UITextField.resignFirstResponder

Когда я нажимаю где-нибудь за пределами UITextField, я хочу, чтобы клавиатура ушла в отставку в качестве первого ответчика и тем самым закрыла клавиатуру. Он отлично работает внутри моей камеры, но не на моем UITableView.

Это мой код: stationenViewController.h:

#import <UIKit/UIKit.h> 
#import "stationenStartCell.h" 
#import "stationenAppDelegate.h" 

@interface stationenViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> { 
    IBOutlet UITableView *theTable; 

    NSString *stationenPlistPath; 
} 

@property (nonatomic, retain) UITableView *theTable; 
@property (nonatomic, retain) IBOutlet NSString *stationenPlistPath; 

- (void)copyStationPlist; 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; 

@end 

stationenViewController.m:

#import "stationenViewController.h" 
#import "chooseStationView.h" 
#import "chooseArrDepView.h" 
#import "stationenStartCellNumber.h" 

@implementation stationenViewController 

@synthesize theTable; 
@synthesize stationenPlistPath; 

- (void)viewWillAppear:(BOOL)animated { 
    [theTable reloadData]; 

    [[[self navigationController] navigationBar] setAlpha:1]; 

    [super viewWillAppear:animated]; 
} 

- (void)viewDidLoad 
{ 
    NSArray *bikePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *bikeDocumentsDirectory = [bikePath objectAtIndex:0]; 
    stationenPlistPath = [bikeDocumentsDirectory stringByAppendingPathComponent:@"stationen.plist"]; 

    if(![[NSFileManager defaultManager] fileExistsAtPath:stationenPlistPath]) 
    { 
     [self copyStationPlist]; 
    } 

    [super viewDidLoad]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 2; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    NSUInteger returnInt = 2; 

    if (section == 1) 
    { 
     returnInt = 1; 
    } 

    return returnInt; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    NSString *returnString = [[NSString alloc] init]; 

    if(section == 0) 
    { 
     returnString = @"Search station details"; 
    } 
    else if (section == 1) 
    { 
     returnString = @"Search train number"; 
    } 

    return returnString; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0) 
    { 
     static NSString *CellIdentifier = @"stationenStartCellID"; 
     stationenStartCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

     if (cell == nil){ 
      NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"stationenStartCell" owner:nil options:nil]; 

      for(id currentObject in topLevelObjects) 
      { 
       if([currentObject isKindOfClass:[stationenStartCell class]]) 
       { 
        cell = (stationenStartCell *)currentObject; 
        break; 
       } 
      } 
     } 

     [[cell theBackground] setBackgroundColor:[[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"stationenStartCell_Background.png"]]]; 
     [[cell theImage] setImage:[UIImage imageNamed:@"icon_checkMark.png"]]; 

     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:0.5]; 

     if(indexPath.row % 4 == 0) 
     { 
      [[cell cellName] setText:NSLocalizedString(@"Choose station", @"Main page")]; 
      [[cell chosenValue] setText:[prefs valueForKey:@"chosenStation"]]; 

      NSLog(@"Log info: %@", [prefs valueForKey:@"chosenStation"]); 

      if([[prefs valueForKey:@"chosenStation"] isEqualToString:@""] || [prefs valueForKey:@"chosenStation"] == nil) 
      { 
       [[cell theImage] setAlpha:0.2]; 
      } 
      else { 
       [[cell theImage] setAlpha:1]; 
      } 
     } 

     if(indexPath.row % 4 == 1) 
     { 
      NSString *searchType = [prefs valueForKey:@"searchType"]; 
      NSString *theValue = @""; 
      if([searchType isEqualToString:@"0"]) 
      { 
       theValue = NSLocalizedString(@"Arrivals", @"Main page"); 
      } 
      else if([searchType isEqualToString:@"1"]) 
      { 
       theValue = NSLocalizedString(@"Departures", @"Main page"); 
      } 

      if([theValue isEqualToString:@""]) 
      { 
       [[cell theImage] setAlpha:0.2]; 
      } 
      else { 
       [[cell theImage] setAlpha:1]; 
      } 

      [[cell cellName] setText:NSLocalizedString(@"Choose departure/arrival", @"Main page")]; 
      [[cell chosenValue] setText:theValue]; 
     } 

     [UIView commitAnimations]; 

     return cell; 
    } 
    else if (indexPath.section == 1) 
    { 
     static NSString *CellIdentifier = @"stationenStartCellNumber"; 
     stationenStartCellNumber *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

     if (cell == nil){ 
      NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"stationenStartCellNumber" owner:nil options:nil]; 

      for(id currentObject in topLevelObjects) 
      { 
       if([currentObject isKindOfClass:[stationenStartCellNumber class]]) 
       { 
        cell = (stationenStartCellNumber *)currentObject; 
        break; 
       } 
      } 
     } 

     [[cell theLabel] setText:@"Tåg nr:"]; 

     return cell; 
    } 

    return nil; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO]; 

    if (indexPath.section == 0) 
    { 
     if(indexPath.row == 0) 
     { 
      chooseStationView *chooseStationViewController = [[chooseStationView alloc] initWithNibName:@"chooseStationView" bundle:nil]; 
      [[self navigationController] pushViewController:chooseStationViewController animated:YES]; 
      [chooseStationViewController release], chooseStationViewController = nil; 
     } 
     else { 
      chooseArrDepView *chooseArrDepViewController = [[chooseArrDepView alloc] initWithNibName:@"chooseArrDepView" bundle:nil]; 
      [[self navigationController] pushViewController:chooseArrDepViewController animated:YES]; 
      [chooseArrDepViewController release], chooseArrDepViewController = nil; 
     } 
    } 
    else { 
     [tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 
    } 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [theTable becomeFirstResponder]; 
    [super touchesBegan:touches withEvent:event]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationPortrait || 
      interfaceOrientation == UIInterfaceOrientationLandscapeLeft || 
      interfaceOrientation == UIInterfaceOrientationLandscapeRight); 
} 

-(void)copyStationPlist 
{ 
    NSString* bikesDictionaryPath = [[NSBundle mainBundle] pathForResource:@"stations" ofType:@"plist"]; 
    NSDictionary* bikesDictionary = [[NSDictionary alloc] initWithContentsOfFile:bikesDictionaryPath]; 

    NSArray *bikePath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *bikeDocumentsDirectory = [bikePath objectAtIndex:0]; 
    NSString *path = [bikeDocumentsDirectory stringByAppendingPathComponent:@"stations.plist"]; 

    NSString * error; 
    NSData * data = [NSPropertyListSerialization dataFromPropertyList:bikesDictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; 
    [data writeToFile:path atomically:YES]; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 

Offcourse, то touchesBegan код не работает на tableView, потому что это один берет на себя. Как я могу отказаться от клавиатуры?

ответ

0

Вы можете создать невидимую UIButton с действием, чтобы уйти с клавиатуры.

Кроме того, вам нужно будет прокрутить табличный вид, чтобы клавиатура не закрывала текстовое поле.

2

вы можете подкласса UITableView и использовать его вместо стандартного UITableView. Зачем? Потому что Вы будете в состоянии сделать что-л, как этот

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [super touvhesBegan:touches withRvrnt:event]; 
} 

этот метод будет вызываться каждый раз, когда вы касаетесь таблицу. поэтому вы сможете оставить свой textField как firstResponder внутри этого метода.

Смежные вопросы