2017-09-19 32 views
9

Tôi đang sử dụng một UISearchController và một UISearchResultsController để thực hiện chức năng tìm kiếm.Thanh tìm kiếm trùng lặp với thanh trạng thái trên iOS 11

MySearchResultsController thực hiện UISearchResultsUpdating và UISearchBarDelegate:

override open func viewDidLoad() { 
    super.viewDidLoad() 
    self.edgesForExtendedLayout = []; 
    self.automaticallyAdjustsScrollViewInsets = false; 
} 

tôi hiển thị thanh tìm kiếm trong tableHeader như thế này trong MyTableViewController:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultsController]; 
    self.searchController.searchResultsUpdater = self.searchResultsController; 
    self.searchController.searchBar.delegate = self.searchResultsController; 
    self.searchController.searchBar.scopeButtonTitles = @[NSLocalizedString(@"SEARCH_SCOPE_TEMPERATURES", nil), NSLocalizedString(@"SEARCH_SCOPE_KNOWHOW", nil)]; 
    self.tableView.tableHeaderView = self.searchController.searchBar; 
    self.definesPresentationContext = YES; 
} 

này đã làm việc một cách hoàn hảo trước đó, nhưng dưới iOS 11 thanh tìm kiếm trùng lặp với thanh trạng thái ngay sau khi tôi gõ vào nó (xem ảnh chụp màn hình). Tôi đã thử rất nhiều thứ khác nhau để làm cho nó hiển thị chính xác nhưng chưa tìm được giải pháp nào.

enter image description here

+0

Tôi chỉ phát hiện ra rằng điều này không xảy ra khi tôi xóa tiêu đề nút phạm vi (mà tôi không muốn làm ...) – Stefan

Trả lời

2

tôi thấy rằng vấn đề là Controller xem trình bày cũng đặt

override open func viewDidLoad() { 
    super.viewDidLoad() 
    self.edgesForExtendedLayout = []; 
    self.automaticallyAdjustsScrollViewInsets = false; 
} 

tôi phải làm điều này vì xem bảng không thực sự mở rộng tất cả các cách để trên đầu .

tôi giải quyết này như thế theo quan điểm điều khiển trình bày của tôi:

override open func viewDidLoad() { 
    super.viewDidLoad() 
    self.automaticallyAdjustsScrollViewInsets = false; 
    if (@available(iOS 11.0, *)) { 
     //NSLog(@"iOS 11.0"); 
    } else { 
     self.edgesForExtendedLayout = UIRectEdgeNone; 
     //NSLog(@"iOS < 11.0"); 
    } 
} 

Có vẻ là một iOS 11 lỗi, hoặc ít nhất là một hành vi kỳ lạ ...

+0

Đây chắc chắn là lỗi, mặc dù tôi thấy tôi không phải chuyên nghiệp vide câu lệnh if được đưa ra trong câu trả lời được đánh dấu là chính xác. Chỉ cần thêm câu lệnh gán cố định tất cả các tình huống xảy ra lỗi (tất cả các phiên bản từ 8.2 đến 10.3.1) và không thay đổi các tình huống mà mọi thứ đang hiển thị tốt (các phiên bản bao gồm và sau 11.0). – Alyoshak

0

tôi quản lý để giải quyết điều này bằng cách subclassing UISearchController. Câu trả lời của tôi là trong Swift nhưng có lẽ các nguyên tắc hoạt động với ojective-c là tốt. Hãy xem câu trả lời của tôi ở đây: https://stackoverflow.com/a/46339336/8639272

1

Đây là những gì Làm việc cho tôi:

override func viewDidLoad() { 
     // to fix the Status Bar Issue: 
     if #available(iOS 11.0, *) { 
      definesPresentationContext = true 
     } 
     // You'll also need this properties on your Search Bar: 
     searchController = UISearchController.init(searchResultsController: nil) 
     searchController?.searchResultsUpdater = self 
     searchController?.hidesNavigationBarDuringPresentation = false 
    } 
+1

Cảm ơn bạn rất nhiều! searchController? .hidesNavigationBarDuringPresentation là những gì tôi đang tìm kiếm! –

+0

Ẩn thanh điều hướng ngăn hoạt ảnh chuyển động thanh lịch của thanh tìm kiếm. Điều này có thể giải quyết vấn đề trùng lặp vì không có hoạt ảnh chuyển dịch nhiều hơn nhưng điều này có thể không phải là những gì mọi người muốn. Cá nhân tôi thích hoạt hình chuyển dịch nhưng đối với lỗi này trong iOS 11. –

Các vấn đề liên quan