Dobry wieczór, Xamarin.iOS kontra Swift, zaczynamy –Dziś dzień pamięci [DSP2016] iOS prosto z poligonu odc.3, tak więc będzie o wyszukiwarce, a właściwie o zielonej wyszukiwarce takiej jak ta:
Wybierzmy co bardziej interesujące kawałki kodu z ostatnich wbitek na github.
Zacznijmy od delegatów. Temat był już poruszany w poprzednim odcinku. O ile ostatnio wdrożyłem podejście silnie typowane, ale okupione tworzeniem dodatkowej klasy TableSource, o tyle tym razem wybrałem drogę na skróty bez silnego typowania, ale bardziej w stosunku 1:1 do oryginału w Swift.
[Export("searchBarSearchButtonClicked:")]
public virtual void SearchButtonClicked(UISearchBar searchBar)
{
searchBar.ResignFirstResponder();
}
private void ConfigureSearchController()
{
searchController = new CustomSearchController((UIViewController)null)
{
WeakSearchResultsUpdater = this
};
searchController.DimsBackgroundDuringPresentation = false;
searchController.SearchBar.SizeToFit();
UISearchBar.Appearance.TintColor = UIColor.FromRGB(197, 225, 165);
searchController.SearchBar.Placeholder = NSBundle.MainBundle.LocalizedString("searchMusic", "Search Music");
searchController.SearchBar.WeakDelegate = this;
DefinesPresentationContext = true;
NavigationItem.TitleView = searchController.SearchBar;
searchController.HidesNavigationBarDuringPresentation = false;
}
[Export("updateSearchResultsForSearchController:")]
public virtual void UpdateSearchResultsForSearchController(UISearchController searchController)
{
FilterContentForSearchText(searchController.SearchBar.Text);
}
I tak cała klasa FileListViewController implementuje protokół UISearchResultsUpdating poprzez oznaczoną atrybutem metodę UpdateSearchResultsForSearchController. W obiekcie klasy CustomSearchController dziedziczącej po UISearchController ustawiamy ogólnie typowaną właściwość WeakSearchResultsUpdater na this. Analogicznie postąpiłem dla UISearchBarDelegate tworząc metodę SearchButtonClicked i ustawiając searchController.SearchBar.WeakDelegate na this.
A jak pokolorować kursor w UISearchBar? Załatwia to linijka:
UISearchBar.Appearance.TintColor = UIColor.FromRGB(197, 225, 165);
Wspomnijmy jeszcze o odtwarzaniu stanu. Generalnie jest podobnie jak w Swift. Na poziomie kontrolera są pewne różnice w metodach kodujących i dekodujących parametry. W C# przedstawia się to w następujący sposób:
public override void EncodeRestorableState(NSCoder coder)
{
base.EncodeRestorableState(coder);
coder.Encode(searchController.Active, RestorationKeys.SearchControllerIsActive.ToString());
coder.Encode(searchController.SearchBar.IsFirstResponder, RestorationKeys.SearchBarIsFirstResponder.ToString());
coder.Encode(new NSString(searchController.SearchBar.Text), RestorationKeys.SearchBarText.ToString());
}
public override void DecodeRestorableState(NSCoder coder)
{
base.DecodeRestorableState(coder);
restoredState.WasActive = coder.DecodeBool(RestorationKeys.SearchControllerIsActive.ToString());
restoredState.WasFirstResponder = coder.DecodeBool(RestorationKeys.SearchBarIsFirstResponder.ToString());
searchController.SearchBar.Text = (NSString)coder.DecodeObject(RestorationKeys.SearchBarText.ToString());
}
W przypadku kodowania mamy metody Encode z przeładowaniem zamiast np. EncodeBool. Nie ma wariantu dla string, dlatego tworzę odpowiedni obiekt NSString. Przy dekodowaniu jest bardziej podobnie jak w oryginale, mamy osobne metody dla różnych typów, ale o krótszych nazwach (np. zamiast decodeBoolForKey jest po prostu DecodeBool).
Na dziś się żegnamy, dobranoc Państwu
Brak komentarzy:
Prześlij komentarz