2013-12-18 140 views
1

我有一個地圖視圖,上面有幾個註釋和一個搜索欄。在iOS 6中一切正常,但iOS 7中存在問題。在iOS 7中,當我選擇一個針時,標題彈出,我可以點擊信息按鈕以轉到該位置的詳細視圖。問題是,當我在iOS 7上搜索時,作爲搜索結果的註釋在註釋周圍出現黑色區域​​,我無法點擊信息按鈕。iOS地圖註釋問題

下面是選擇引腳上搜索:

enter image description here

這裏,它是尋找一個後:

enter image description here

這裏是我的,當你搜索會發生什麼代碼:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    id<MKAnnotation> ann; 
    BOOL annotationFound = NO; 
    // NSRange titleRange = [annTitle rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
    // NSRange subtitleRange = [annSubtitle rangeOfString:searchText options:NSCaseInsensitiveSearch]; 

    for (int i = 0; i < [marketLocations count]; i++) 
    { 
     for (ann in marketLocations) 
     { 
      NSString *annTitle = ann.title; 
      NSString *annSubtitle = ann.subtitle; 
      NSString *searchText = [searchBar text]; 
      NSRange titleRange = [annTitle rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      NSRange subtitleRange = [annSubtitle rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      CLLocationCoordinate2D annCoord; 
      annCoord.latitude = ann.coordinate.latitude; 
      annCoord.longitude = ann.coordinate.longitude; 

      // if ([ann.title isEqualToString:[searchBar text]]) 
      if (titleRange.location != NSNotFound) 
      { 
       MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(annCoord, 5000, 5000); 
       [worldView setRegion:region animated:YES]; 
       [worldView selectAnnotation:ann animated:YES]; 
       annotationFound = YES; 
      } 
      // else if ([ann.subtitle isEqualToString:[searchBar text]]) 
      else if (subtitleRange.location != NSNotFound) 
      { 
       MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(annCoord, 5000, 5000); 
       [worldView setRegion:region animated:YES]; 
       [worldView selectAnnotation:ann animated:YES]; 
       annotationFound = YES; 
      } 
     } 
    } 
    if (annotationFound == NO) 
    { 
     UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"" message:@"No Matches Found" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [av dismissWithClickedButtonIndex:0 animated:YES]; 
     [av show]; 
    } 

    [searchBar resignFirstResponder]; 
} 

回答

1

有兩個關於中所示的搜索碼奇怪的事情,我相信他們都在幫助導致奇怪的顯示問題:

  1. for循環穿過marketLocations陣列和內for循環通過marketLocations陣列。

    這種嵌套看起來並不必要,並且會導致搜索執行比您需要的更多的迭代。

    如果有100個註釋,搜索將執行100 x 100次迭代(10,000)而不是100次(因爲循環中沒有break s)。也許你可能會注意到搜索時略有延遲,當有不僅僅是幾個註釋。

    它看起來像你只需要一個for循環。

  2. 當「匹配」註釋被發現,代碼調用setRegionselectAnnotation(它們都涉及更新到顯示),然後繼續與搜索循環。

    在已經調用selectAnnotation之後繼續搜索更多匹配的註釋是沒有意義的,因爲地圖視圖只允許單次註釋在任何時候被「選中」(顯示標註)。

    您應該break循環一旦匹配註釋中發現或追蹤「最佳匹配註釋」和呼叫setRegionselectAnnotation搜索循環之後。


我相信迭代與多個,快速調用setRegionselectAnnotation相結合的數百(可能數以千計)的很緊的循環導致此顯示問題。我能夠用100個註釋複製它。

爲什麼它只出現在iOS 7中是我無法回答的東西,但我懷疑iOS 6對此感到高興(也沒有顯示它)。

所以我的建議是:

  1. 使用單一for環和,
  2. 假設你要停在第一個「匹配」,做break停止循環中調用selectAnnotation之後。

的代碼可能是這個樣子:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    id<MKAnnotation> ann; 
    BOOL annotationFound = NO; 

    // SINGLE for-loop... 
    for (ann in marketLocations) 
    { 
     NSString *annTitle = ann.title; 
     NSString *annSubtitle = ann.subtitle; 
     NSString *searchText = [searchBar text]; 
     NSRange titleRange = [annTitle rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     NSRange subtitleRange = [annSubtitle rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
     CLLocationCoordinate2D annCoord; 
     annCoord.latitude = ann.coordinate.latitude; 
     annCoord.longitude = ann.coordinate.longitude; 

     if (titleRange.location != NSNotFound) 
     { 
      MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(annCoord, 5000, 5000); 
      [worldView setRegion:region animated:YES]; 
      [worldView selectAnnotation:ann animated:YES]; 
      annotationFound = YES; 
      break; // <-- STOP searching, exit the loop 
     } 
     else if (subtitleRange.location != NSNotFound) 
     { 
      MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(annCoord, 5000, 5000); 
      [worldView setRegion:region animated:YES]; 
      [worldView selectAnnotation:ann animated:YES]; 
      annotationFound = YES; 
      break; // <-- STOP searching, exit the loop 
     } 
    } 

    if (annotationFound == NO) 
    { 
     UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"" message:@"No Matches Found" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [av dismissWithClickedButtonIndex:0 animated:YES]; 
     [av show]; 
    } 

    [searchBar resignFirstResponder]; 
} 
+0

它看起來像這個問題時註解結果是最後一個只發生它找到一個匹配,因此是顯示的那個。如果我在那裏添加中斷,問題不會顯示出來。這個問題雖然是我的搜索結果,雖然技術上正確,但不是我想要的。例如,如果我搜索haney,那麼我會得到chaney的註釋,因爲它首先得到它。 – raginggoat

+0

對,所以你必須先循環所有註釋來找到「最佳匹配」,然後在循環之後調用selectAnnotation。 – Anna

+0

我不知道如何找到最佳匹配。 – raginggoat

0

其實我已經找到了一個非常簡單的解決。取而代之的

NSRange titleRange = [annTitle rangeOfString:searchText options:NSCaseInsensitiveSearch];

我把它改成

NSRange titleRange = [annTitle rangeOfString:searchText];

並設置

searchBar.autocapitalizationType = UITextAutocapitalizationTypeWords;