2012-01-01 28 views
11

Tôi đang cố tạo một UISearchDisplayController theo chương trình. Tôi có một phương pháp mà nên thiết lập bộ điều khiển tìm kiếm của tôi, nhưng khi tôi gọi nó, không có gì xảy ra.Tạo một UISearchDisplayController lập trình

Phương pháp này -setupSearch tôi:

- (void)setupSearch { 
    UISearchBar *myBar; 
    UISearchDisplayController *myCon; 

    myBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
    [myBar sizeToFit]; 

    myCon = [[UISearchDisplayController alloc] 
      initWithSearchBar:myBar contentsController:self]; 
    [myBar release]; 

    myCon.delegate = self; 
    myCon.searchResultsDataSource = self; 
    myCon.searchResultsDelegate = self; 

    /* Setup scopes */ 
    { 
     NSMutableArray *scopes; 
     NSUInteger count, i; 
     NSString *aScope; 

     count = SCOPE_COUNT; 
     scopes = [[NSMutableArray alloc] initWithCapacity:count]; 
     for(i = 0; i < count; i++) { 
      // I create four scopes here 
     } 

     myCon.searchBar.scopeButtonTitles = scopes; 
     [scopes release]; 
    } 

    [myCon release]; 
} 

tôi gọi là phương pháp trên trong phương pháp -viewDidLoad của subclassed tôi UITableViewController. Thật không may là không có gì xảy ra khi bộ điều khiển xem bảng của tôi được hiển thị trong một UITabBarController.

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

12

Kiểm tra mã ví dụ trong: [ https://github.com/JayMarshal/GrabCasts.com-iPhone-Client/blob/master/CoreDataTableViewController.m][1]

Repo đây: https://github.com/JayMarshal/Grabcasts

Nó là một phiên bản mở rộng của coredatatableviewcontroller của khóa học stanford iOS.

đoạn có liên quan của mã sau:

- (void)createSearchBar { 
if (self.searchKey.length) { 
    if (self.tableView && !self.tableView.tableHeaderView) { 
     UISearchBar *searchBar = [[[UISearchBar alloc] init] autorelease]; 
     self.searchDisplayController 
       = [[UISearchDisplayController alloc] initWithSearchBar:searchBar 
                contentsController:self]; 
     self.searchDisplayController.searchResultsDelegate = self; 
     self.searchDisplayController.searchResultsDataSource = self; 
     self.searchDisplayController.delegate = self; 
     searchBar.frame = CGRectMake(0, 0, 0, 38); 
     self.tableView.tableHeaderView = searchBar; 
    } 
} else { 
    self.tableView.tableHeaderView = nil; 
} 

Về cơ bản nó gắn các UISearchDisplayController tự (mà phải là một tableviewcontroller) như là một tác dụng phụ của việc khởi tạo. Vì vậy, việc thiết:

self.searchDisplayController.searchResultsDelegate = self; 
self.searchDisplayController.searchResultsDataSource = self; 

Thay vì

myCon.searchResultsDataSource = self; 
myCon.searchResultsDelegate = self; 

Có thể làm các trick. Trong gỡ rối, kiểm tra xem myCon và self.searchDisplayController đang trỏ đến cùng một đối tượng?

Đã cập nhật: có vẻ như có lỗi trong thuộc tính SDC của TVC mà nó không được giữ lại trong runloop. Nộp như: http://openradar.appspot.com/10254897 cũng được đề cập trên SO, xem UIViewController does not retain its programmatically-created UISearchDisplayController

+1

Từ tài liệu, về nội dungController: "Đây thường là một thể hiện của UITableViewController.". Thông thường, không bắt buộc. –

+0

Vì vậy, nếu bạn không muốn sử dụng một 'UITableViewController', bạn chỉ có thể có một' UIViewController' phù hợp với các giao thức 'UITableViewDataSource' và' UITableViewDelegate'. –

+6

Vấn đề của tôi với điều này là 'self.searchDisplayController' là một thuộc tính chỉ đọc trên' UITableViewController', và mã ở đây là thiết lập nó. –

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