środa, 17 sierpnia 2016

Xamarin.iOS kontra Swift odc.2 (UISearchController, UISearchBar, stan aplikacji, stylowanie)

Dobry wieczór, Xamarin.iOS kontra Swift, zaczynamy –Winking smileDziś 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:

IMG_0046

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 Winking smile

Brak komentarzy: