Setting the inputAccessoryView of a UITextField to its superview

岁酱吖の 提交于 2019-12-23 21:19:38

问题


I have a UITableView with an Add cell... row and would like to have a keyboard pop up with a view above it like in the "Messages" application, where the user can type the name of the new cell.

I realize that there are several other ways to get user data, and several ways to implement the functionality that I am trying to achieve.

For example, the iPod application presents a popup when a new playlist should be created.

Right now, I have a hidden text field that is set to be the first responder when the Add cell... row is pressed, and I assign the view containing the input field and confirmation button as the inputAccessoryView for this hidden field. Alternatively, I could add this view as a subview of the table and position it using keyboard notifications.

I would just like to know if there is a cleaner way to accomplish what I am trying to do (such as setting the inputAccessoryView of the input textField to be displayed to be the textField's superview). I have tried several approaches, but I cannot seem to be able to dismiss the keyboard using resignFirstResponder when the view should close. I can get the inputAccessoryView to disappear, but the keyboard remains resolutely open, taking up necessary screen real estate. Also, when the nib's view is a UITableView with a UITableViewController as the File's Owner rather than a UIView with a UIViewController as the File's Owner, I get a very odd error: "setting the first responder view of the table but we don't know its type (cell/header/footer)"

Thanks in advance, Julian Ceipek


回答1:


You are on the right track with the setInputAccessoryView on the UITextView/UITextField classes' This method allows you to add any view you want to the top of a keyboard. The view you create would then use a delegation method to tell the main view controller to resignFirstResponder.

So, to get you started:

@protocol TextFieldAccessoryViewDelegate
@required
- (void)keyboardShouldDismiss;

@end

@interface TextFieldAccessoryView : UIView
@property (nonatomic, retain) id<TextFieldAccessoryViewDelegate> delegate;

- (id)initWithFrame:(CGRect)frame withDelegate (id<TextFieldAccessoryViewDelegate>)aDelegate;

@end

The implementation might look a little like (only posting the code that makes the view):

#pragma mark - Private methods
- (void)doneButtonTapped:(id)sender
{
    [delegate keyboardShouldDismiss];
}

- (void)setUpChildrenView
{
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonTapped:)];

    UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@""];
    [navigationItem setRightBarButtonItem:doneButton];
    [navigationItem setHidesBackButton:YES];

    UINavigationBar *navigationBar = [[[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, self.width, 44.0f)] autorelease];
    [navigationBar pushNavigationItem:navigationItem animated:NO];

    [self addSubview:navigationBar];
}

I have used a standard NavigationBar looking view, but you could put in anything you like and include buttons, textfields, images of robot unicorns, the works

If you don't get everything thats going on in the above code you might need to brush up on Delegation and creating views programmatically.




回答2:


  - (void)viewDidLoad
  {
    [self createAccessoryView];

    [textField setDelegate:self];
    [textField setKeyboardType:UIKeyboardTypeDefault];
    [textField setInputAccessoryView:fieldAccessoryView];


  }


- (void)createAccessoryView
    {

        CGRect frame = CGRectMake(0.0, self.view.bounds.size.height, self.view.bounds.size.width, 44.0);
        fieldAccessoryView = [[UIToolbar alloc] initWithFrame:frame];
        fieldAccessoryView.barStyle = UIBarStyleBlackOpaque;
        fieldAccessoryView.tag = 200;

        [fieldAccessoryView setBarStyle:UIBarStyleBlack];

        UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone  target:self action:@selector(done:)];

        UISegmentedControl* segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocalizedString(@"Previous", @""), NSLocalizedString(@"Next", @""), nil]];
        [segmentedControl addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
        segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
        [segmentedControl setMomentary:YES];
        UIBarButtonItem *segmentButton = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];

        [fieldAccessoryView setItems:[NSArray arrayWithObjects:segmentButton, spaceButton, doneButton, nil] animated:NO];
        [segmentButton release];
        [spaceButton release];
        [doneButton release];
        [segmentedControl release];

    }


来源:https://stackoverflow.com/questions/6791154/setting-the-inputaccessoryview-of-a-uitextfield-to-its-superview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!