【问题标题】:make UItextfield to function like UISearchBar使 UItextfield 像 UISearchBar 一样运行
【发布时间】:2012-12-17 13:14:27
【问题描述】:

我想改变UISearchBar的外观:所以,

如果有一种方法可以让我的UITextField(在自定义背景中进行搜索)像UISearchBar 一样运行?或子类化和覆盖- (void)layoutSubviews 是唯一的方法?

请告诉如何继承它!!!

【问题讨论】:

    标签: iphone ios uisearchbar


    【解决方案1】:

    也可以使用 UITextFieldDelegates

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{    
    NSString *searchString;
    if (string.length > 0) {        
        searchString = [NSString stringWithFormat:@"%@%@",textField.text, string];
    } else {
       searchString = [textField.text substringToIndex:[textField.text length] - 1];
    }
    NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchString];
    resultArray = [[resultTempArray filteredArrayUsingPredicate:filter] mutableCopy];
    
    if (!searchString || searchString.length == 0) {
    
        resultArray = [resultTempArray mutableCopy];
    } else {
        if (resultArray.count == 0) {
    NSLog(@"No data From Search");
        }
    }    
    [tableView reloadData];    
    return YES;
    }
    

    【讨论】:

    • thnQ 伙计,实际上我有同样的想法,但尚未实施,但在看到你的想法后,我才确认我的想法是正确的,并且在 CONTAINS 附近有一个小的变化,它应该是 SELF CONTAINS 否则它会崩溃.....
    【解决方案2】:

    使用 UItextfield 委托方法进行过滤

    #pragma mark - UITEXTFIELD DELEGATE METHODS -
    
    - (BOOL)textFieldShouldReturn:(UITextField *)textField{
        [textField resignFirstResponder];
        return YES;
    }
    
    - (BOOL)textFieldShouldClear:(UITextField *)textField{
        arrFilterSearch = nil;
        arrFilterSearch = [NSMutableArray arrayWithArray:arrSearch];
        UITableView *tblView = (UITableView *)[self.view viewWithTag:tblView_Tag];
        [tblView reloadData];
        return YES;
    }
    
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
        NSString *searchKey = [textField.text stringByAppendingString:string];
        arrFilterSearch = nil;
        searchKey = [searchKey stringByReplacingCharactersInRange:range withString:@""];
        if (searchKey.length) {
                NSPredicate *pred = [NSPredicate predicateWithFormat:@"firstname contains[cd] %@", searchKey];
                arrFilterSearch = [NSMutableArray arrayWithArray:[arrSearch filteredArrayUsingPredicate:pred]];
        }
        else
            arrFilterSearch = [NSMutableArray arrayWithArray:arrSearch];
    
        UITableView *tblView = (UITableView *)[self.view viewWithTag:tblView_Tag];
        [tblView reloadData];
        return YES;
    }
    

    【讨论】:

      【解决方案3】:

      好的,我遇到了同样的问题,我将 UISearchBar 子类化了!给你了

      - (void) layoutSubviews {
      
      [super layoutSubviews];
      UITextField *searchField = nil;
          for (UIView *subview in self.subviews) {
              if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
                  [subview removeFromSuperview];
              }
      
              if ([subview isKindOfClass:[UITextField class]]) {
                  searchField = (UITextField *)subview;
                  searchField.leftViewMode = UITextFieldViewModeNever;
                  [searchField setValue:[UIFont systemFontOfSize:8] forKeyPath:@"_placeholderLabel.font"];
                   [searchField setBackground: [UIImage imageNamed:@"images.png"] ];
                    searchField.clearButtonMode = UITextFieldViewModeNever;
              }
      
      }
      self.showsCancelButton = NO;
      }
      

      【讨论】:

        【解决方案4】:

        更改 UIsearchBar 背景是获得自定义 UISearchBar 的一种方法。但是,如果您想要有限的搜索表格功能,您可以使用普通文本字段并连接搜索按钮以过滤另一个数组中的 tableview 的结果并使用该数组更新 tabledata。

        UIsearchBar 的- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 几乎等同于UItextField's valieChanged IBAction

        【讨论】:

          【解决方案5】:

          您可以使用以下代码更改UISearchBar 背景..

          for (UIView *subview in searchBar.subviews) {
                  if ([subview isKindOfClass:NSClassFromString(@"UISearchBarBackground")]) {
                      UIView *bg = [[UIView alloc] initWithFrame:subview.frame];
                      bg.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"SkyBackground.jpeg"]];
                      [searchBar insertSubview:bg aboveSubview:subview];
                      [subview removeFromSuperview];
                      break;
                  }
              }
          

          通过此代码,您可以为UISearchBar 的背景设置图像或其他任何内容。

          另请参阅我的这个答案以及一些其他功能来更改搜索栏组件布局..How to change inside background color of UISearchBar component on iOS

          更新:

          要更改取消按钮的外观,请使用以下代码...

             UIButton *cancelButton = nil;
          
              for(UIView *subView in searchBar.subviews)
              {
                  if([subView isKindOfClass:[UIButton class]])
                  {
                      cancelButton = (UIButton*)subView;
                      //do something here with this cancel Button
                  }
              }
          

          【讨论】:

          • 它改变了背景,但文本字段的大小以及放大镜和取消按钮仍然存在。这就是为什么我想要一个自定义文本字段的行为类似于 UIseachBar
          • 只是将整个背景设置为清晰,也无法显示取消按钮..表示启用 = 否
          • 就像 [searchBar setShowsCancelButton:NO];使用此行隐藏取消按钮,只需使用此代码执行某些操作,您将获得所需的输出,,,另请参阅我在上面发布链接的答案..您可以从中得到一些东西..希望它对您有所帮助。 . :)
          • 好的,首先我删除了 UIsearchbar 的背景,然后放置了我自己的。然后使用您的上述链接更改 UItext Field 的背景。现在的问题是我需要取消按钮,我如何访问它来更改它的框架和类型
          • 要更改哪个,默认取消??
          【解决方案6】:

          试试这个

              self.TextFieldSearch = (UITextField *)[self.Search.subviews lastObject];
              [self.TextFieldSearch removeFromSuperview];
              [self.view addSubview:self.TextFieldSearch];
              self.TextFieldSearch.delegate = self;
              self.TextFieldSearch.font = [UIFont systemFontOfSize:10];
              self.TextFieldSearch.keyboardAppearance =  UIKeyboardAppearanceAlert;
              [self.Search removeFromSuperview];
          

          【讨论】:

            猜你喜欢
            • 2015-10-13
            • 2014-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-01
            相关资源
            最近更新 更多