2013-10-03 3 views
7

Ich habe ein xCode-Projekt, das eine Tabellenansicht mit einem "Suchleisten- und Suchanzeige-Controller" enthält, damit der Benutzer die Liste der angezeigten Elemente verfeinern kann. Im Allgemeinen wurde die Anleitung in http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view befolgt. Ich habe kürzlich den neuesten xCode (Version 5.0 (5A1413)) mit iOS 7-Unterstützung heruntergeladen und die betreffende App auf verschiedenen Zielen getestet.Abbrechen und Löschen der UISearchBar-Schaltflächen in iOS 7 funktioniert nicht

Wenn diese App auf einem iOS 6-Ziel (Emulator oder reales Gerät) ausgeführt wird, funktioniert sie wie erwartet. Durch Drücken der Abbrechen-Taste wird die Suchleiste entfernt und durch Drücken der Löschtaste (kleines graues x) werden alle Suchkriterien gelöscht bereits vom Benutzer eingegeben. Wenn das Projekt jedoch auf einem iOS 7-Ziel ausgeführt wird, funktionieren die Lösch- und Abbrechen-Schaltfläche nicht.

Die searchBarCancelButtonClicked Methode wird in diesem Projekt umgesetzt, und ich überprüft habe, dass es nicht aufgerufen wird, wenn das Ziel iOS läuft 7.

- (void)searchBarCancelButtonClicked:(UISearchBar *)SearchBar 
{ 
    NSLog(@"searchBarCancelButtonClicked called"); 

    self.searchBar.text = nil; 

    … 

    // Hide Search bar when cancelled 
    [self hideSeachBar]; 

    [self.searchBar resignFirstResponder]; 

    … 
    } 

ist mein Tisch-View-Controller-Setup die UISearchDisplayDelegate und UISearchBarDelegate zu sein. Und es scheint, dass dies immer noch als searchBar funktioniert: textDidChange: wird entweder auf einem iOS 6 oder 7 Ziel aufgerufen.

@interface ItemViewController() <UISearchDisplayDelegate, UISearchBarDelegate> 
… 
@end 

Ich kann keine anderen Beiträge zu diesem oder einem iOS 7 Wechselmaterial (wie https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html#//apple_ref/doc/uid/TP40013174-CH8-SW1) im Zusammenhang sehen, dass jede Umkodierung erwähnt, die getan werden muss, iOS7 zu unterstützen.

Irgendwelche Gedanken dazu? Danke

+0

Ich hatte keine Chance, die Antworten zu überprüfen, aber ich habe auch gerade diese Beiträge für das gleiche Problem festgestellt: https://devforums.apple.com/message/880210#880210 und https://devforums.apple. com/Nachricht/876407 # 876407. – Mike

+0

Dieser Code funktioniert für iOS7: http://StackOverflow.com/a/22287788/771689 –

Antwort

3

Ich habe das gleiche Problem, versuchte ich mit dem folgenden Code. Probieren Sie mal das hier an.

-(void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller 
{ 
    controller.active = YES; 

    [self.view addSubview:controller.searchBar]; 
    [self.view bringSubviewToFront:controller.searchBar]; 
} 

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView { 

    tableView.frame = self.archiveListTblView.frame; 
} 

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller 
{ 
    controller.active=NO; 

    [self.view addSubview:controller.searchBar]; 
} 
+0

Neugierig, wie Ihre self.archiveListTblView festgelegt und verwendet wird. – Mike

+0

Hallo Mike, Aus meiner Sicht: iOS7 erstellt automatisch das Layout für seine Krippenfenster. Das ist der Grund für das Problem, dem wir gegenüberstanden. Und noch etwas habe ich mit "self.view.frame" anstelle von "self.archiveListTblView.frame" versucht. Auch dieser Code funktioniert auch gut für mich. Das Problem war, dass wir den Rahmen für die Tabellenansicht nicht festgelegt haben. :-P – Prabakaran

0

Ich googelte über das Internet und konnte keine Lösung finden. Also habe ich das Verhalten der UItableview geändert.

statt [searchBar becomeFirstResponder]; ich blättere, um die Tableview nach unten.

- (IBAction)goToSearch:(id)sender { 

scroll down to show the table. 
// CGRect newBounds = self.TableView.bounds; 
// newBounds.origin.y =0; 
//  
// self.TableView.bounds = newBounds; 
//[searchBar becomeFirstResponder]; 

    CGPoint contentOffset=self.TableView.contentOffset; 
    contentOffset.y=0; 
    [self.TableView setContentOffset:contentOffset animated:YES]; 


} 

in meinem viewDidLoad:

//  CGRect newBounds = self.TableView.bounds; 
//  newBounds.origin.y = newBounds.origin.y + searchBar.bounds.size.height; 
     // self.TableView.bounds = newBounds; 

     CGPoint contentOffset=self.TableView.contentOffset; 
     contentOffset.y=self.TableView.bounds.origin.y + searchBar.bounds.size.height; 
     self.TableView.contentOffset=contentOffset; 

Wenn aus irgendwelchen Gründen gefunden, in iOS 7, Ansicht Änderungstabelle Grenzen führen Suchleiste zu verschwinden. Hoffe, dass hilft.

1

Schaltfläche Abbrechen und die Schaltfläche Löschen funktioniert nicht, wenn Sie die Schaltfläche Suche bei der Navigation berühren. Wenn Sie auf die Suchleiste tippen, um die Suche nach Sternen zu starten, funktioniert das normal. => Das bedeutet, wenn die Suchleiste vor der Suche nicht auf dem Bildschirm angezeigt wird, scheinen diese Schaltflächen auch deaktiviert zu sein.

Also, dass ich eine Lösung gefunden habe, aber es ist nicht vollkommen perfekt. Bevor Sie die Suchleiste zur ersten Antwort machen, müssen Sie die Tabellenansicht nach oben blättern. Probieren Sie diesen Code aus.

-(IBAction)goToSearch:(id)sender { 
    // Make search bar visible on screen before make it response 
    [_tableView setContentOffset:CGPointMake(0, 0) animated:NO]; 

    // Make search bar active 
    [candySearchBar becomeFirstResponder]; 
} 

Das einzige Problem auftreten, wenn Sie dies tun, wird nach oben scrollen Ihre Tabellenansicht ist, was bedeutet, wenn Sie Suche abzubrechen, die Sie vor aktuellen Zelle Index verloren.

1

Dieses Problem scheint von dem neuen Verhalten der transluzenten Eigenschaft in einer Navigationsleiste zu stammen.

Seit iOS 7 Navigationsleisten sind standardmäßig transparent. Und es sieht so aus, als ob es die Suchleiste überlappt, wenn Sie es nach dem Drücken einer Taste anzeigen. Wenn Sie zum Anfang Ihrer ListView blättern und die Suchleiste verwenden, sollte sie ordnungsgemäß funktionieren.

Versuchen Sie in Ihrem Controller zu setzen:

float osVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; 
if (osVersion >= 7.0) 
{ 
    self.navigationController.navigationBar.translucent = NO; 
} 

Dies sollte das Problem schnell lösen.

Aber ich denke, für eine bessere Lösung sollten Sie die iOS 7 transition guide sehen, wo sie erklären, wie transluzente Navigationsleisten zu behandeln.

Hoffe, dass hilft.

1

Ich hatte dieses Problem auch. Seltsamerweise werden andere Delegate-Methoden von UISearchBarDelegate aufgerufen. Eine Abhilfe könnte sein:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    if ([searchText length] == 0) { 
     NSLog("No Text"); 
    } 
} 

Es funktionierte für mich

0

In meinem Fall hatte ich die searchbar zum oberen Rand des Bildschirms positioniert, und es gab eine unsichtbare Ansicht, die über die searchbar überlappt.

Also Abbrechen Schaltfläche wurde tatsächlich nicht berührt.

Also, ich habe die Suchleiste Front gebracht, wenn [searchBarTextDidBeginEditing] -Methode wie unten genannt wurde.

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ 
    lc_SearchBarYPos.constant = 20.0f; //this is code to reposition the searchbar 
    [self.view bringSubviewToFront:searchBar]; 
} 

Hoffe, das kann helfen.