带有文本快捷方式的自定义 UIToolbar 的行为与带有 UIButtons 和 UITableViewControllers 的键盘完全不同

Posted

技术标签:

【中文标题】带有文本快捷方式的自定义 UIToolbar 的行为与带有 UIButtons 和 UITableViewControllers 的键盘完全不同【英文标题】:A custom UIToolbar with text shortcuts acts completely differently from the Keyboard with UIButtons and UITableViewControllers 【发布时间】:2014-04-02 09:09:59 【问题描述】:

我有一个我认为会很复杂的情况来描述。

我有一个TableViewController (Event Entry) 作为用户的输入功能,用户点击UITextField,转到这个TableViewController,顶部有一个UISearchBar,他们可以从TableView 中选择一个现有名称,使用UISearchBarUITableView 中搜索一个名称,或者通过在UISearchBar 中输入字母来创建一个名称以查找不存在的条目。如果该事件不存在,则会在屏幕中间用一个按钮提示他们,其中文本标签为“创建”,后跟用户输入的名称。如果用户添加更多字母,则会将其附加到 UIButton 的标题中。

我有一个UIToolbar,它位于键盘正上方,带有 5 个按钮,标题为婚礼、生日、新年等。它可以帮助用户在添加新事件时不必输入这些常用词。

TableView 中的数据由Core Data 填充,其中包含先前输入的事件。

问题 我面临的情况是 UIToolbar 按钮对键盘的反应方式不同。如果我从键盘输入“婚礼”,它会在以“婚礼”开头的 TableView 中显示结果,或者会在屏幕中间显示一个“创建”按钮,以便能够创建该条目。如果我在 UIToolbar 上按婚礼,它不会过滤 UITableView 并且不会为我提供“创建”该事件的能力,尽管它确实将“婚礼”一词附加到顶部的 UISearchBar。只有当我使用键盘删除或添加一个字符时,它才会使用 UITableView 和 Create 按钮注册。

例如,我正在创建一个名为“约翰的婚礼”的活动,不带引号。我在UISearchBar 中输入“John's”,然后出现“Create”UIButton(因为我没有“John's”作为条目),所以“创建”按钮的标题现在是“Create John's”。如果我在UIToolbar 上为婚礼按下UIBarButtonItem,它会附加到搜索栏的末尾,但不会附加到创建按钮的末尾。

所以在UISearchBar 中,我现在有“约翰的婚礼”,但创建按钮的标题是“创建约翰的”。

如果我使用退格键从UISearchBar 中删除一个字符,则创建按钮会在其末尾显示婚礼。

我错过了什么?似乎某种 reloadData 需要在某处发生。

这里是 UIToolbar 的创建:

-(void)configureKeyboardToolbars

    UIToolbar *eventToolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f,
                                                                          self.view.window.frame.size.width, 44.0f)];

    self.selectedKeyboardTheme = [[NSUserDefaults standardUserDefaults] objectForKey:@"Keyboard"];
    if ([self.selectedKeyboardTheme isEqualToString:@"Dark"])
    
        eventToolBar.tintColor = [UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f];
        eventToolBar.barTintColor = [UIColor blackColor];

        eventToolBar.translucent = YES;

    
    else if ([self.selectedKeyboardTheme isEqualToString:@"Light"])
    
        eventToolBar.tintColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:1.0f];
        eventToolBar.barTintColor = [UIColor whiteColor];
        eventToolBar.translucent = YES;

    

    eventToolBar.items =   @[ [[UIBarButtonItem alloc] initWithTitle:@"Wedding"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(barButtonAddText:)],
                              [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                            target:nil
                                                                            action:nil],
                              [[UIBarButtonItem alloc] initWithTitle:@"Birthday"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(barButtonAddText:)],
                              [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                            target:nil
                                                                            action:nil],
                              [[UIBarButtonItem alloc] initWithTitle:@"Anniversary"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(barButtonAddText:)],
                              [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                            target:nil
                                                                            action:nil],
                              [[UIBarButtonItem alloc] initWithTitle:@"New Year"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(barButtonAddText:)],
                              [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                                            target:nil
                                                                            action:nil],];

    // Assign the toolbar to the occasionTextField
    self.eventAddSearchBar.inputAccessoryView = eventToolBar;

这是在点击 barbuttonitem 时调用的方法:

-(IBAction)barButtonAddText:(UIBarButtonItem*)sender

    if (self.eventAddSearchBar.isFirstResponder)
    
        NSString *insertedText = self.eventAddSearchBar.text;
        self.eventAddSearchBar.text = [insertedText stringByAppendingFormat:@"%@", sender.title];
        [self.eventAddSearchTableView reloadData];
    

这是显示创建按钮的方法。 Create 按钮在 viewDidLoad 中创建。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText


    self.eventAddSearchBar.showsCancelButton = YES;

    _autocompleteFetchedResultsController = nil;
    NSError *error;
    if (![[self autocompleteFetchedResultsController] performFetch:&error])
    
        // Handle Error
    
    else
    
        [self.eventAddSearchTableView reloadData];
        [self.createButton setHidden:_autocompleteFetchedResultsController.fetchedObjects.count > 0];
        [self.createButton setTitle:[NSString stringWithFormat:@"Create %@", self.eventAddSearchBar.text] forState:UIControlStateNormal];


        if (![self.eventAddSearchBar isFirstResponder])
        
            self.shouldBeginEditing = NO;
            [self.eventAddSearchTableView reloadData];
            [self.eventAddSearchBar resignFirstResponder];
        

    

所以问题是,UIToolbar BarButtonItems 对与 UITableView 相关的任何事情都没有任何影响。如果我输入婚礼,它会过滤以婚礼开头的结果。如果我从 UIToolbar 中选择婚礼,它不会过滤 TableView。它也不会激活“创建”按钮。

我希望这是有道理的。如果没有,我很抱歉,我很乐意为此提供任何进一步的信息,但任何有关这方面的指导将不胜感激。

【问题讨论】:

【参考方案1】:

情况已解决。

我从点击 UIBarButtonItem 时调用的方法调用了 [self searchBar:self.eventAddSearchBar textDidChange:self.eventAddSearchBar.text];

-(IBAction)barButtonAddText:(UIBarButtonItem*)sender

    if (self.eventAddSearchBar.isFirstResponder)
    
        NSString *insertedText = self.eventAddSearchBar.text;
        self.eventAddSearchBar.text = [insertedText stringByAppendingFormat:@"%@", sender.title];
        [self searchBar:self.eventAddSearchBar textDidChange:self.eventAddSearchBar.text];
    

【讨论】:

以上是关于带有文本快捷方式的自定义 UIToolbar 的行为与带有 UIButtons 和 UITableViewControllers 的键盘完全不同的主要内容,如果未能解决你的问题,请参考以下文章

UIToolbar 上可更新的自定义视图

带有自定义 UIToolbar xib 的 Storyboard 中的 UINavigationController 失败

UIToolBar:如何设置自定义文本/背景颜色

使用 UINavigationController 默认 UIToolbar 的自定义背景

来自图像的自定义 UIToolBar

json Sublime文本的自定义快捷键