2012-06-14 24 views
28

Mam istniejący ViewController + XIb w moim projekcie, a teraz chcę dodać UITableView z komórkami statycznych, podobnie jak to:Jak używać komórek statycznych w UITableView bez korzystania z Scenorysów?

TableView with static cells

Ale kiedy przeciągnij UITableView na moim ekranie nie mam mieć menu "Treść> Statyczne" w Inspektorze atrybutów.

Próbowałem już zrobić moją podklasę kontrolera UITableViewController, ale to nie pomaga - nadal nie mam możliwości korzystania z komórek statycznych w Inspektorze atrybutów.

Rozejrzałem się wokół StackOverflow, ale nie znalazłem żadnych odpowiedzi na to pytanie. Wszystkie istniejące pytania dotyczą Storyboard (których nie używam) zamiast plików xib.

Domyślam się, że Xcode działa jakaś magia, gdy dodajesz UITableViewController do storyboardu, ale nie wtedy, gdy zmieniasz istniejący xib na dziedziczący z UITableViewController.

Wszelkie porady, jak dodać widok tabeli z komórkami statycznymi do istniejącego pliku Xib?

Odpowiedz

43

Komórki z widokiem na tabelę statyczną są dostępne tylko w przypadku korzystania ze scenorysów. Jeśli jednak nie używasz scenorysów dla całego interfejsu użytkownika, możesz nadal używać ich na poszczególnych ekranach zamiast na kolekcję ekranów.

W tym celu można utworzyć plik UIStoryboard z jednym kontrolerem widoku, który ma jego właściciela pliku ustawionego na niestandardową podklasę kontrolera widoku. Ustaw identyfikator VC na pewną wartość. Gdy chcesz wyświetlić to, pobierz scenorys, a następnie stwórz swoją podklasę kontrolera widoku, tworząc znak VC z storyboardu.

UIStoryboard *tableViewStoryboard = [UIStoryboard storyboardWithName:@"your storyboard" bundle:nil]; 
CustomViewController = [tableViewStoryboard instantiateViewControllerWithIdentifier:@"custom identifier"]; 

Możesz zaprezentować ten VC jak zwykle w swojej aplikacji.

To świetny sposób, aby zacząć używać scenorysów bez konieczności konwertowania całej aplikacji, aby z nich korzystać.

+5

co z wydajnością w tym przypadku? – mariusLAN

+1

nie można utworzyć scenariusza dla systemu ios 4.3 lub wcześniejszego :( – tesmojones

22

Jest to wykonalne bez storyboardów:

  1. kontroler musi przyjąć protokoły tableview delegata i źródła ... UITableViewDelegate, UITableViewDataSource
  2. Dodawanie widoku tabeli do .xib; ustaw styl widoku tabeli na "zgrupowany"
  3. Połącz tabelę z właściwością kontrolera (nazwijmy ją "twoja tabelaTableView").
  4. Dodaj komórki widoku tabeli do pliku .xib jako osobne widoki ... tj. nie jako subviews widoku tabeli ... będą one swobodnie pływające w pliku .xib. (patrz przykładowy obraz poniżej)
  5. Dodaj elementy sterujące/etykiety itp. do komórek tabeli.
  6. Przypisz unikalne ciągi do pola "Identyfikator" w Atrybutach dla każdej komórki widoku tabeli.
  7. Połącz komórki tabeli do innych właściwości w kontrolerze (sliderCell, switchCell, etc)
  8. Połącz wydarzenia posłać kontrolnych komórek dla metod IBAction-ED w kontroler - (IBAction) handleSliderCell itp
  9. W metodzie viewDidLoad swojego kontrolera przypisać delegata i źródło widoku tabeli do kontrolera (self.yourTableControl.delegate = siebie; self.yourTableControl.dataSource = siebie;)
  10. wdrożyć numberOfSectionsInTableView, numberOfRowsInSection i cellForRowAtIndexPath w kontrolerze
  11. w tableview: cellForRowAtIndexPath :, powrócić yourFirstCell, yourSecondCell itp wskazówki dotyczące właściwego indexPath ceni

Imprezy dla kontroli dla komórek tabeli powinien udać się do swoich procedur procedur obsługi ...

Przykład Krok 4: xib

+1

Czy jest jakaś zaleta tego podejścia, jeśli kieruje się tylko wersjami systemu iOS, w których obsługiwane są storyboardy? – philwilks

+0

Nie działa dla mnie. ** Nie można załadować końcówki pakiet ** błąd i nie mogę jawnie zarejestrować stalówka, ponieważ nie ma żadnych klas powiązanych z komórkami utworzonymi w IB, więc właśnie stworzyłem podklasy 'UITableViewCell' i dodałem je do komórek i spróbowałem ponownie, ale wciąż bez powodzenia Pojawia się ten sam błąd: – Isuru

+1

@philwilks - zaletą tego przy użyciu storyboardów jest to, że dostajesz korzyści z zarządzania konfiguracją, ponieważ nie używasz storyboardów - więc jeśli wielu deweloperów aktualizuje interfejs użytkownika, nie dostaniesz takiego błotnika –

0

Aby rozwinąć na odpowiedź BVB jest, jeśli chodzi o numer 10, oto Swift 3 Fragmenty dla Twoich metod delegata Tableview. Pamiętaj, aby dodać punkty sprzedaży do wszystkich swoich komórek w Xib.

Gdy ręcznie tworzysz sekcje widoku tabeli, pamiętaj, że indexPath jest równa dwuwymiarowej tablicy reprezentującej strukturę tabeli. na przykład, gdy indexPath zostanie przekazany do tableView(cellForRowAt indexPath: IndexPath) jest równy [1][0], twoja komórka zostanie umieszczona w pierwszej pozycji drugiej sekcji.

Wartości można wyciągnąć z indexPath o właściwościach indexPath.row i indexPath.section. Korzystając z tych wartości, możesz ręcznie tworzyć sekcje z IBOutletów w dowolnej kolejności.

@IBOutlet var is_enabled: UITableViewCell! 
@IBOutlet var is_public: UITableViewCell! 

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    switch(section){ 
     case 0: 
      return "Cell 1" 
     case 1: 
      return "Cell 2" 
     default: return "" 

    } 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 1 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 2 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    print("index path here", indexPath) 
    if(indexPath.section == 0) { 
     return is_enabled 
    } 
    else if(indexPath.section == 1) { 
     return is_public 
    } else { 
     return is_enabled 
    } 
} 
Powiązane problemy