Ios UISearchBar在向下滚动之前不可见

Ios UISearchBar在向下滚动之前不可见,ios,objective-c,uitableview,uisearchbar,uirefreshcontrol,Ios,Objective C,Uitableview,Uisearchbar,Uirefreshcontrol,我以编程方式将UISearchBar添加到我的tableHeaderView中,但它不会在视图加载时显示。 我的表格内容上方只有一个空格。当我向下滚动一点,它就会出现。 我更改了tableHeaderView的背景色,以查看它是否可见-我可以看到更改后的颜色,因此看起来搜索栏本身是不可见的。 有什么想法吗 这是我的密码: - (void)viewDidLoad { [super viewDidLoad]; ... // Initialize the refresh control. [self.

我以编程方式将UISearchBar添加到我的tableHeaderView中,但它不会在视图加载时显示。 我的表格内容上方只有一个空格。当我向下滚动一点,它就会出现。 我更改了tableHeaderView的背景色,以查看它是否可见-我可以看到更改后的颜色,因此看起来搜索栏本身是不可见的。 有什么想法吗

这是我的密码:

- (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];
}
好的,我发现是刷新控件导致了问题。 在VIEWWILLISE中,将调用一个方法来更新刷新控件的标题。当我对这一行进行注释时,会出现搜索栏:

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

因此,如何使它们都工作???

问题是因为您试图向同一位置添加两个东西,因为您从未真正为其中任何一个指定帧,即使UIResultsController知道它的位置,它也可以更改,并且UIControlEventValueChanged[向下拖动]可能是由于帧的变化而导致差异。因此,我建议通过故事板实现搜索栏,因为您声明正在使用它。将搜索显示控制器拖放到导航栏下方的表格视图上方,您将看到光标变为绿色加号,这意味着您可以将其拖放到该位置(在本例中为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.."];
}

现在,对于添加到同一位置的两个项目,应该没有冲突的帧更改

创建一个刷新控件并将其设置为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;

我也有同样的问题。我通过实际调整内容偏移量来修复它,从而触发橡皮筋滚动动画,从而使UISearchBar重新出现

如果不可见,请尝试以下操作:

[self.tableView setContentOffset:CGPointMake(0, -1) animated:NO]; 
您可以通过以下方式进行设置:

self.navigationItem.hidesSearchBarWhenScrolling = NO;

是否向tableview标头添加了其他内容,或者是否将其contentOffset设置为其他内容?我为tableview控制器的refreshControl属性分配了一个刷新控件。我不确定它是否也放在tableview标题中?是否使用故事板?是的,但不用于搜索栏或刷新控件。谢谢您的详细提示。我试过了,但没什么变化。我的下一个尝试是将IB也用于refreshControl,但这意味着我的项目中会有很多变化,因为它还没有在我的tableViewController的超类中定义-也许这就是问题所在…@Markus您不必在IB中创建UIRefreshControl请使用4个空格而不是倒勾来格式化代码块。很好。我直接设置self.refresh控件,首先创建一个局部变量,然后设置它。不太清楚为什么这仍然不能提供自版本属性文本,但是,嘿,它工作了!你是个救生员