一小段延迟后添加的iOS搜索栏不会出现在导航栏中

时间:2019-05-31 09:46:53

标签: ios uinavigationbar uisearchbar

如果我在延迟0.1秒后添加搜索栏,则它不会出现在导航栏中。如果我将延迟更改为0.5秒,则确实会出现。这是因为延迟短时在推动画期间运行吗?在延迟0.1秒后如何显示?

- (void)viewDidLoad
{
    [super viewDidLoad];
    double delayInSeconds = .1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        self.definesPresentationContext = YES;
        UISearchController *searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
        [self.navigationItem setSearchController:searchController];
        [self.navigationItem setHidesSearchBarWhenScrolling:NO];
    });
}

3 个答案:

答案 0 :(得分:1)

我尝试在项目中执行相同的操作,即使我将延迟指定为0.5秒,但在viewDidLoad 一致中都无法正常工作

在我看来,在viewDidLoad中执行此操作不是一个好主意(在这种情况下),因为您推送的VC的视图大多在推送动画开始之前就已加载,并且延迟在此之前完成动画完成

在这些情况下,最终对我来说很好:

  • 当不希望对推送进行动画处理时,即navigationController?.pushViewController(yourVC, animated: false)
  • 当我为推送动画设置动画并在推送的VC的viewDidAppear中执行所有延迟操作时(这可能是您需要执行的操作)

据我所知,在推动动画完成之前分配navigationItem的{​​{1}}是

答案 1 :(得分:0)

将您的代码放入此块...将延迟1秒钟,并让我知道是否存在问题

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1, execute: {


        })

答案 2 :(得分:0)

这个为我工作

DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
        self.navigationItem.searchController = self.searchController
        self.navigationController?.view.setNeedsLayout()
        self.navigationController?.view.layoutIfNeeded()
    }