2015-04-06 15 views
21

Tôi có một ứng dụng với UISearchController. yếu tố này của giao diện người dùng được thiết lập hoàn toàn trong mã như thế này:UISearchController bền bỉ sau khi segue

searchController = UISearchController(searchResultsController: nil) 
searchController.searchResultsUpdater = self 
searchController.searchBar.delegate = self 
searchController.dimsBackgroundDuringPresentation = false 
searchController.hidesNavigationBarDuringPresentation = false 
searchController.searchBar.searchBarStyle = UISearchBarStyle.Minimal 

searchController.searchBar.frame = CGRectMake(searchController.searchBar.frame.origin.x, searchController.searchBar.frame.origin.y, searchController.searchBar.frame.size.width, 44.0) 

Tôi sau đó thêm nó vào tableView của tableHeaderView

tableView.tableHeaderView = searchController.searchBar 

của tôi Tất cả mọi thứ dường như được làm việc tốt, nhưng khi đó là tích cực và tôi chọn một mục trong tableView của tôi, ứng dụng của tôi sẽ phân biệt với một bộ điều khiển khung nhìn khác với bộ điều khiển tìm kiếm vẫn tồn tại trong khung nhìn. Tôi không chắc chắn như thế nào điều này là có thể kể từ khi bộ điều khiển tìm kiếm phải là một subview của xem bảng trong một bộ điều khiển xem. Làm thế nào tôi có thể ngăn chặn điều này xảy ra?

screenshot

+0

Would nó quá khó để chỉ 'nil' nó ra trong 'preparForSegue'? –

+0

Phần tốt nhất về điều này là 'tableView.tableHeaderView = nil' không có tác dụng gì khi tôi gọi nó trong' preparForSegue'.Hoặc bạn có nghĩa là để nil ra toàn bộ 'searchController'? Tôi không chắc cách tốt nhất để xử lý tất cả những điều này là gì trong trường hợp đó. –

+1

thử đặt 'searchController.active' thành' false' trong 'prepareForSegue'. –

Trả lời

50

Bạn có thể ẩn searchController bằng tay bằng cách thiết lập thuộc tính tích cực để sai trong prepareForSegue. Thêm mã dưới đây vào prepareForSegue()

searchController.active = false 

Ngoài ra, bạn nên thêm dòng sau trong viewDidLoad() để có được những hành vi mặc định

definesPresentationContext = true 

Từ tài liệu cho definesPresentationContext

Một giá trị logic Boolean cho biết khung nhìn của trình điều khiển xem này có được bao phủ hay không khi trình điều khiển khung nhìn hoặc một trong các hậu duệ của nó trình bày một bộ điều khiển khung nhìn.

Thảo luận

Khi một bộ điều khiển xem được trình bày, iOS bắt đầu với bộ điều khiển xem trình bày và hỏi nó nếu nó muốn cung cấp trình bày ngữ cảnh. Nếu trình điều khiển chế độ xem hiện tại không cung cấp ngữ cảnh, thì iOS sẽ yêu cầu chế độ xem phụ huynh của bộ điều khiển xem . iOS tìm kiếm thông qua hệ thống phân cấp bộ điều khiển xem cho đến khi trình điều khiển chế độ xem cung cấp ngữ cảnh trình bày. Nếu không có chế độ xem nào bộ điều khiển đề xuất để cung cấp ngữ cảnh, trình xem gốc của cửa sổ sẽ cung cấp ngữ cảnh trình bày.

Nếu bộ điều khiển chế độ xem trả về giá trị true, thì nó cung cấp một bản trình bày ngữ cảnh. Phần cửa sổ được bao phủ bởi chế độ xem của bộ điều khiển chế độ xem xác định kích thước của chế độ xem của bộ điều khiển chế độ xem được trình bày. Giá trị mặc định cho thuộc tính này là sai.

+0

Cảm ơn bạn! Đặc biệt là về bit về bối cảnh trình bày! –

+1

4 giờ tìm kiếm và thử các tùy chọn khác nhau và không thể tìm được giải pháp làm việc cho điều đó! đã cố gắng ** searchBar.hidden = true ** nhưng nó đã gây ra rất nhiều thiệt hại ở khắp mọi nơi. cảm ơn một lần nữa! – Slavomir

+2

definePresentationContext hoàn toàn là câu trả lời đúng. Nếu bạn sử dụng bất kỳ tùy chọn nào khác như loại bỏ hoặc hoạt động thành sai, nó sẽ hủy tìm kiếm ban đầu của bạn, trong khi definePresentationContext sẽ đưa bạn quay lại chính xác cách bạn mong đợi mọi thứ. Cảm ơn nhiều. – Darren

3

Nếu bạn quản lý quá trình chuyển đổi của riêng bạn và sử dụng popToViewController rời khỏi xem, tạo ra khung cảnh trên searchController thay vì xem

searchController.definesPresentationContext = true 

hoặc bạn sẽ nhận được một lỗi

popToViewController:transition: called on <UINavigationController 0x7f984204f800> while an existing transition or presentation is occurring; the navigation stack will not be updated 
+0

Điều này đúng, 'self.definesPresentationContext = true' không hoạt động – fujianjin6471

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