具有文本快捷键的自定义UIToolbar与UIButtons和UITableViewControllers的键盘完全不同作用

问题描述:

我相信这将是一种复杂的情况来描述。具有文本快捷键的自定义UIToolbar与UIButtons和UITableViewControllers的键盘完全不同作用

我有一个TableViewController(Event Entry)充当用户输入功能,当用户点击一个UITextField,在顶部得到采取这种TableViewControllerUISearchBar,他们可以从TableView选择一个现有的名称,搜索在UITableView中使用UISearchBar作为名称,或者通过在UISearchBar中输入不存在的条目的字母来创建名称。如果事件不存在,他们会在屏幕中间出现一个按钮,其中的文本标签是Create,随后是用户输入的名称。如果用户添加更多字母,则会附加到UIButton的标题。

我有一个UIToolbar,它位于键盘正上方,有5个按钮,分别命名为婚礼,生日,新年等。它可以帮助用户在添加新事件时不必输入那些常见词汇。

TableView中的数据填充了Core Data以及先前输入的事件。

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

例如,我创建了一个名为“John's Wedding”的事件,但没有引号。我在UISearchBar中输入了“John's”,并且出现了“Create”UIButton(因为我没有“John's”作为条目),所以Create按钮的标题现在是“Create John's”。如果我在UIToolbar上按婚宴的UIBarButtonItem,它会附加到searchBar的末尾,但不会结束到创建按钮。

所以在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。它也不会激活“创建”按钮。

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

情况已解决。

我从调用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]; 
    } 
}