【问题标题】:UISearchBar not visible until scroll downUISearchBar 在向下滚动之前不可见
【发布时间】:2015-01-24 14:34:23
【问题描述】:

我以编程方式向 tableHeaderView 添加了 UISearchBar,但它没有在视图加载时显示。 我的表格内容上方只有一个空白区域。当我向下滚动一点时,它会出现。 我更改了 tableHeaderView 的背景颜色以查看它是否完全可见 - 我可以看到更改后的颜色,因此 searchBar 本身似乎是不可见的。 有什么想法吗?

这是我的代码:

- (void)viewDidLoad
{
[super viewDidLoad];
...
// Initialize the refresh control.
[self.refreshControl addTarget:self
                        action:@selector(refreshData)
              forControlEvents:UIControlEventValueChanged];
// Suchelemente erzeugen
self.searchBar = [UISearchBar new];
self.searchDC = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
self.searchDC.searchResultsDelegate = self;
self.searchDC.delegate = self;
self.searchDC.searchResultsDataSource = self;
self.tableView.tableHeaderView = self.searchBar;
// some attempts to make it visible
self.searchBar.hidden = NO;
self.searchBar.layer.hidden = NO;
[self.searchBar sizeToFit];
}

好的,发现是刷新控件导致了问题。 在 viewWillAppear 中调用了一个方法来更新刷新控件的标题。当我评论这一行时,会出现搜索栏:

self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:title];

那么,如何让它们都工作呢?

【问题讨论】:

  • 您是在 tableview 标题中添加其他内容还是将其 contentOffset 设置为某些内容?
  • 我为表格视图控制器的 refreshControl 属性分配了一个刷新控件。不知道是不是也放在tableview header中?
  • 你在使用故事板吗?
  • 是的,但不是搜索栏或刷新控件。

标签: ios objective-c uitableview uisearchbar uirefreshcontrol


【解决方案1】:

你可以设置:

self.navigationItem.hidesSearchBarWhenScrolling = NO;

【讨论】:

    【解决方案2】:

    创建一个刷新控件并将其设置为tableview的刷新控件。这样self.refreshcontrol的属性文本就没有设置了。

    UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:GetLocalizedString(@"REFRESH_TO_RELEASE_TITLE", nil)];
    [refresh addTarget:self action:@selector(refreshViewPulled:) forControlEvents:UIControlEventValueChanged];
    self.refreshControl=refresh;
    

    【讨论】:

    • 请使用 4 个空格而不是反引号来格式化您的代码块。
    • 不错。我直接设置 self.refreshControl 并首先创建一个局部变量然后设置它工作。不太清楚为什么它仍然没有给出自我版本的属性文本,但是嘿,它有效!
    【解决方案3】:

    我遇到了同样的问题。我通过务实地调整内容偏移来修复它,以便触发橡皮筋滚动动画,导致 UISearchBar 重新出现。

    如果不可见,试试这个:

    [self.tableView setContentOffset:CGPointMake(0, -1) animated:NO]; 
    

    【讨论】:

      【解决方案4】:

      问题是因为您尝试将 2 个东西添加到同一个位置,因为您从未真正为任何一个指定框架,即使 UIResultsController 知道它的去向,它可以更改,并且 UIControlEventValueChanged [向下拖动] 可能是造成帧变化的差异。所以我建议通过情节提要来实现你的搜索栏,因为你说你正在使用它。将 Search Display Controller 拖放到 Navigation Bar 下方但 Table View 上方,您会看到光标变为绿色加号,这意味着您可以将其拖放到那里(在本例中是 tableViewHeader):

      然后你应该能够继续务实地改变 UIRefreshControl 正常

      -(void)viewDidLoad {
          self.refreshControl = [[UIRefreshControl alloc] init];
          self.refreshControl.backgroundColor = [UIColor clearColor];
          self.refreshControl.tintColor = [UIColor purpleColor];
          [self.refreshControl addTarget:self
                              action:@selector(refreshView:)
                    forControlEvents:UIControlEventValueChanged]
          self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull down to Refresh.."];
      }
      

      现在添加到同一位置的两个项目应该不会有冲突的框架更改。

      【讨论】:

      • 感谢您提供详细的提示。试过了,但没有任何改变。我的下一次尝试也是将 IB 用于 refreshControl,但这意味着在我的项目中进行很多更改,因为它尚未在我的 tableViewController 的超类中定义 - 也许这就是问题...
      • @Markus 你不必在 IB 中创建 UIRefreshControl
      猜你喜欢
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多