resignFirstResponder

时间:2009-12-18 23:11:18

标签: iphone objective-c uitableview iphone-sdk-3.0

我在调整键盘时遇到了一些问题。我有一个有两个部分的桌子。在第二部分中,我加载了具有stationenStartCellNumber的类UITextField

当我按下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

当然,touchesBegan代码无法在tableView上运行,因为该代码接管了。我该如何辞退键盘?

2 个答案:

答案 0 :(得分:2)

您可以继承UITableView并使用它而不是标准UITableView。为什么?因为你可以像这样做什么

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

每次触摸桌子时都会调用此方法。因此,您可以将textField作为firstResponder在此方法中重新签名。

答案 1 :(得分:0)

您可以使用操作来创建一个不可见的UIButton来重新签名键盘。

此外,您需要确保滚动表格视图,以便键盘不会覆盖您的文本字段。