2012-01-01 17 views
11

बनाना मैं प्रोग्रामिंग के UISearchDisplayController बनाने की कोशिश कर रहा हूं। मेरे पास एक तरीका है जो मेरे खोज नियंत्रक को स्थापित करना चाहिए, लेकिन जब मैं इसे कॉल करता हूं, कुछ भी नहीं होता है।एक UISearchDisplayController प्रोग्रामेटिक रूप से

यह मेरा -setupSearch विधि:

- (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]; 
} 

मैं अपने subclassed UITableViewController की -viewDidLoad विधि में उपरोक्त विधि कहते हैं। दुर्भाग्य से कुछ भी नहीं होता है जब मेरी तालिका दृश्य नियंत्रक UITabBarController में प्रदर्शित होता है।

किसी भी मदद की सराहना की जाएगी। [ https://github.com/JayMarshal/GrabCasts.com-iPhone-Client/blob/master/CoreDataTableViewController.m][1]

रेपो यहाँ: में बाहर उदाहरण कोड

उत्तर

12

चेक https://github.com/JayMarshal/Grabcasts

यह स्टैनफोर्ड आईओएस पाठ्यक्रमों की coredatatableviewcontroller की एक विस्तारित संस्करण है।

कि कोड के प्रासंगिक टुकड़ा इस प्रकार है:

- (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; 
} 

मूल रूप से यह आत्म करने के लिए UISearchDisplayController आरंभीकरण का एक पक्ष प्रभाव के रूप में (जो एक tableviewcontroller होना चाहिए) जुड़ जाता है। तो की स्थापना:

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

बजाय

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

चाल कर सकता है। डिबगिंग में, जांचें कि क्या MyCon और self.searchDisplayController एक ही ऑब्जेक्ट पर इंगित कर रहे हैं?

अपडेटेडः टीवीसी की एसडीसी संपत्ति में एक बग प्रतीत होता है कि इसे रनलोप में नहीं रखा जाता है। दायर के रूप में: http://openradar.appspot.com/10254897 भी इतने पर उल्लेख किया है, UIViewController does not retain its programmatically-created UISearchDisplayController

डॉक से
+1

, contentsController पर देखते हैं: "यह आम तौर पर UITableViewController का एक उदाहरण है।"। आमतौर पर, आवश्यक नहीं है। –

+0

इसलिए यदि आप 'UITableViewController' का उपयोग नहीं करना चाहते हैं, तो आपके पास केवल' UIViewController' हो सकता है जो प्रोटोकॉल 'UITableViewDataSource' और 'UITableViewDelegate' के अनुरूप है। –

+6

इसके साथ मेरी समस्या यह है कि 'self.searchDisplayController'' UITableViewController' पर एक पठनीय संपत्ति है, और फिर भी यहां कोड स्थापित कर रहा है। –

संबंधित मुद्दे