2015-02-01 13 views
7

Tôi đang cố gắng để có được UISearchBar + UISearchController làm việc trong Obj-C, sau cùng với mã ví dụ của Apple here. Tôi không muốn đặt thanh tìm kiếm trong tiêu đề xem bảng, như chúng làm trong ví dụ, vì vậy tôi đang thiết lập các ràng buộc để gắn nó vào đầu bộ điều khiển chế độ xem chính. Đây hoạt động tốt cho việc định vị, nhưng khi tôi chạm vào thanh tìm kiếm và nó cố gắng modally trình bày các kết quả điều khiển xem bảng (searchResultsTVC), nó ném một lỗi trên những hạn chế:Lỗi AutoLayout của UISearchBar Trên Bản trình bày của tìm kiếmĐoàn lạiController

2015-02-01 00:36:47.539 Search-FeatureTest[15521:3760972] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fc911c77f90 UISearchBar:0x7fc911c6b880.left == UIView:0x7fc911c69b70.left> 
When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug. 
2015-02-01 00:36:47.539 Search-FeatureTest[15521:3760972] *** Assertion failure in -[UIView _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:], /SourceCache/UIKit_Sim/UIKit-3318.16.14/NSLayoutConstraint_UIKitAdditions.m:560 
2015-02-01 00:36:47.541 Search-FeatureTest[15521:3760972] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Impossible to set up layout with view hierarchy unprepared for constraint.' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00000001047aef35 __exceptionPreprocess + 165 
    1 libobjc.A.dylib      0x0000000104447bb7 objc_exception_throw + 45 
    2 CoreFoundation      0x00000001047aed9a +[NSException raise:format:arguments:] + 106 
    3 Foundation       0x00000001040645df -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195 
    4 UIKit        0x0000000105215cf2 __120-[UIView(UIConstraintBasedLayout) _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:]_block_invoke_2 + 177 
    5 UIKit        0x0000000105215be7 -[UIView(UIConstraintBasedLayout) _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:] + 377 
    6 UIKit        0x0000000105215ea4 -[UIView(UIConstraintBasedLayout) _tryToAddConstraintWithoutUpdatingConstraintsArray:roundingAdjustment:mutuallyExclusiveConstraints:] + 30 
    7 UIKit        0x0000000105215fcc -[UIView(UIConstraintBasedLayout) _tryToAddConstraint:roundingAdjustment:mutuallyExclusiveConstraints:] + 243 
    8 UIKit        0x000000010521630b __50-[UIView(UIConstraintBasedLayout) addConstraints:]_block_invoke + 188 
    9 Foundation       0x0000000103fedd6e -[NSISEngine withBehaviors:performModifications:] + 155 
    10 UIKit        0x0000000105216240 -[UIView(UIConstraintBasedLayout) addConstraints:] + 263 
    11 UIKit        0x000000010520f112 -[_UISearchPresentationController presentationTransitionWillBegin] + 759 
    12 UIKit        0x0000000104ca00a7 __71-[UIPresentationController _initViewHierarchyForPresentationSuperview:]_block_invoke + 1398 
    13 UIKit        0x0000000104c9eb50 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 175 
    14 UIKit        0x0000000104bbe331 _applyBlockToCFArrayCopiedToStack + 314 
    15 UIKit        0x0000000104bbe1ab _afterCACommitHandler + 516 
    16 CoreFoundation      0x00000001046e3dc7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 
    17 CoreFoundation      0x00000001046e3d20 __CFRunLoopDoObservers + 368 
    18 CoreFoundation      0x00000001046d9b53 __CFRunLoopRun + 1123 
    19 CoreFoundation      0x00000001046d9486 CFRunLoopRunSpecific + 470 
    20 GraphicsServices     0x0000000107d7d9f0 GSEventRunModal + 161 
    21 UIKit        0x0000000104b9b420 UIApplicationMain + 1282 
    22 Search-FeatureTest     0x0000000103f19043 main + 115 
    23 libdyld.dylib      0x0000000106d3e145 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Đây là mã nơi tôi khởi tạo bộ điều khiển tìm kiếm và hạn chế thanh tìm kiếm của:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.searchResultsTVC = [[SearchResultsTVC alloc]init]; 
    self.allObjects = [NSMutableArray arrayWithArray:@[@"A", @"AA", @"ABBA", @"B", @"BOB", @"C", @"D", @"E", @"F", @"G", @"H"]]; 

    self.searchController = [[UISearchController alloc]initWithSearchResultsController:self.searchResultsTVC]; 
    [self.searchController setSearchResultsUpdater:self]; 
    [self.searchController setDelegate:self]; 

    [self.searchController.searchBar setDelegate:self]; 
    [self.view addSubview:self.searchController.searchBar]; 

    //constraints for searchBar 
    [self.searchController.searchBar setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    UISearchBar *searchBar = self.searchController.searchBar; 
    id topLayoutGuide = self.topLayoutGuide; 

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[searchBar]|" options:NSLayoutFormatDirectionLeftToRight metrics:nil views:NSDictionaryOfVariableBindings(searchBar)]]; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topLayoutGuide][searchBar]" options:NSLayoutFormatDirectionLeftToRight metrics:nil views:NSDictionaryOfVariableBindings(topLayoutGuide, searchBar)]]; 

} 
+0

tôi đã không tìm thấy một giải pháp được nêu ra. Hiện tại tôi sẽ cố gắng hack nó bằng cách đặt nó vào một tableView không có hàng, với thanh tìm kiếm như một header và phần còn lại của view như một footer. –

+3

Tôi giải quyết vấn đề bằng cách đặt UISearchBar trong UIView, sau đó thêm các ràng buộc trên UIView. – zoo

+0

Điều đó hoạt động - Không thể tin rằng tôi không nghĩ về nó. Cảm ơn! –

Trả lời

1

giải pháp: (để đối phó với Darmen)

Như Zoo đề nghị, tôi đã thêm một cái nhìn chứa trong xây dựng giao diện, hạn chế lên đỉnh và cạnh của superView , với chiều cao 44.

sau đó tôi đặt thanh tìm kiếm trong giao diện như thế này:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.searchController = [[UISearchController alloc]initWithSearchResultsController:<Your SearchResultsController>]; 
    [self.searchController setSearchResultsUpdater:self]; 
    [self.searchController setDelegate:self]; 

    [self.searchController.searchBar setDelegate:self]; 

    [self.searchBarContainer addSubview:self.searchController.searchBar]; 

    self.definesPresentationContext = YES; 
} 
+4

Dường như không hoạt động. – adib

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