UITableview z więcej niż jedną niestandardową komórką z Swift

Chcę użyć UITableview z różnymi niestandardowymi dzwonkami tableViewCells. Moje 3 komórki są takie:

  • Cell1: powinien mieć obraz i etykietę.
  • Cell2: powinna mieć dwie etykiety.
  • Cell3: powinien mieć dayPicker.

Nie chcę kodować znacznika dla komórek. Jak mogę sobie z tym poradzić w Swift? Czy muszę kodować własną klasę dla każdej komórki? Czy mogę użyć jednego tableviewController? Jak mogę wypełnić dane w różnych komórkach?

Chciałbym Wygeneruj widok tableView, na przykład aplikację kontaktową Urządzenia z systemem iOS.

Author: Honey, 2015-06-11

4 answers

Pozwól, że zacznę od odpowiedzi na twoje pytania.

Czy muszę kodować własną klasę dla każdej komórki?= > Tak, tak sądzę. Przynajmniej tak bym zrobił.

Czy mogę użyć jednego tableviewController?= > Tak, możesz. Można jednak mieć również widok tabeli wewnątrz kontrolera widoku.

Jak mogę wypełnić dane w różnych komórkach? => W zależności od warunków, można wypełnić dane w różnych komórkach. Załóżmy na przykład, że chcesz, aby Twoje pierwsze dwa wiersze były jak pierwszy typ komórek. Tak więc po prostu tworzysz / ponownie używasz pierwszego typu komórek i ustawiasz jego dane. Będzie bardziej jasne, kiedy pokażę Ci zrzuty ekranu, tak myślę.

Pozwól, że podam ci przykład z TableView wewnątrz kontrolera Viewcontrollera. Gdy zrozumiesz główną koncepcję, możesz spróbować zmodyfikować w dowolny sposób.

Krok 1: Utwórz 3 Własne TableViewCells. Nazwałem go, FirstCustomTableViewCell, SecondCustomTableViewCell, ThirdCustomTableViewCell. Powinieneś użyć bardziej znaczącego nazwiska.

Tutaj wpisz opis obrazka

Krok 2: Przejdź do głównego.storyboard i przeciągnij i upuść Widok TableView wewnątrz kontrolera widoku. Teraz wybierz Widok tabeli i przejdź do inspektora tożsamości. Ustaw "Prototype Cells" na 3. Tutaj właśnie powiedziałeś swojemu TableView, że możesz mieć 3 różne rodzaje komórek.

Tutaj wpisz opis obrazka

Krok 3: Teraz wybierz pierwszą komórkę w widoku tabeli, a w Inspektorze tożsamości umieść "FirstCustomTableViewCell" w polu Niestandardowa klasa, a następnie ustaw identyfikator jako "firstCustomCell" w Inspektorze atrybutów.

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

Zrób to samo dla wszystkich innych-ustaw ich własne klasy odpowiednio jako" SecondCustomTableViewCell "i" ThirdCustomTableViewCell". Ustawiaj również identyfikatory kolejno jako secondCustomCell i thirdCustomCell.

Krok 4: Edytuj niestandardowe klasy komórek i dodaj gniazda zgodnie z potrzebami. Zmodyfikowałem go na podstawie Twojego pytania.

P. S: musisz umieścić gniazdka pod klasą definicja.

Więc, w pierwszej kolejności.swift, Pod

class FirstCustomTableViewCell: UITableViewCell {

Można umieścić etykietę i widok obrazu.

 @IBOutlet weak var myImageView: UIImageView!
 @IBOutlet weak var myLabel: UILabel!

I w drugiej kolejności.swift, dodaj dwie etykiety jak -

import UIKit

class SecondCustomTableViewCell: UITableViewCell {

    @IBOutlet weak var myLabel_1: UILabel!
    @IBOutlet weak var myLabel_2: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

I trzeci Celtableviewcell.swift powinien wyglądać-

import UIKit

class ThirdCustomTableViewCell: UITableViewCell {

    @IBOutlet weak var dayPicker: UIDatePicker!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

Krok 5: w kontrolerze ViewController Utwórz Gniazdo dla TableView i ustaw połączenie z storyboard. Ponadto musisz dodać UITableViewDelegate i UITableViewDataSource w definicji klasy jako listy protokołów. Więc twoja definicja klasy powinna wyglądać tak: -

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

Następnie dołącz UITableViewDelegate i UITableViewDatasource widoku tabeli do kontrolera. W tym momencie twój kontroler widoku.swift powinien wyglądać -

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

P. s: jeśli miałbyś używać TableViewController zamiast TableView wewnątrz Viewcontrollera, mogłeś pominąć ten krok.

Krok 6: przeciągnij i upuść widoki obrazu i etykiety w komórce zgodnie z klasą komórki. a następnie zapewnij połączenie z ich gniazdami ze storyboard.

Krok 7: Teraz zapisz wymagane metody UITableViewDatasource w kontrolerze widoku.

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        if indexPath.row == 0 {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "firstCustomCell")
            //set the data here
            return cell
        }
        else if indexPath.row == 1 {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "secondCustomCell")
            //set the data here
            return cell
        }
        else {
            let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "thirdCustomCell")
            //set the data here
            return cell
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
 239
Author: Natasha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 15:09:16

Swift 3.0 + update with minimum code

Pojęcie podstawowe: Utwórz widok tabeli z dynamicznymi prototypami komórek. Przypisz identyfikator i utwórz własną klasę komórki widoku tabeli dla każdego prototypu komórki. Inicjowanie i Pokazywanie niestandardowych komórek w metodzie delegowania w widoku tabeli.

1. Tworzenie komórek na storyboardzie

Przeciągnij widok tabeli do kontrolera widoku, Dodaj do niego komórki prototypowe, a następnie upuść element UI do komórek widoku tabeli, dodaj constraint poprawnie, jeśli potrzebne.

Tutaj wpisz opis obrazka

2. Tworzenie własnych klas UITableViewCell

Dodaj poniższy kod do swojego projektu. Umieszczam go tuż nad klasą kontrolera widoku.

class FirstTableCell: UITableViewCell {
}

class SecondTableCell: UITableViewCell {
}

class ThirdTableCell: UITableViewCell {   
}

3. Przypisanie niestandardowej klasy i identyfikatora do prototypów komórek

Dla każdego prototypu komórki w storyboard Przypisz klasę niestandardową utworzoną w Kroku 2, a następnie wprowadź unikalny identyfikator.

Tutaj wpisz opis obrazka

4. Połącz elementy interfejsu użytkownika do kodu swift

Sterowanie przeciągnij widok tabeli i połącz się z klasą kontrolera widoku. Kontrola Przeciągnij elementy interfejsu użytkownika, które zostaną dodane do prototypów komórek w kroku 1, i połącz się z odpowiednią klasą komórek widoku tabeli.

Tutaj wpisz opis obrazka

5. Dodaj kod do kontrolera widoku i steruj widokiem tabeli

Dostosuj kontroler widoku do delegata widoku tabeli

class YourViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

W viewDidLoad skonfiguruj delegata i dane widoku tabeli źródło.

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.dataSource = self
    self.tableView.delegate = self

}

Na koniec dodaj dwie metody delegowania, aby kontrolować widok tabeli, zgodnie z minimalnymi wymaganiami.

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "firstTableCell") as! FirstTableCell
        // Set up cell.label
        return cell
    } else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "secondTableCell") as! SecondTableCell
        // Set up cell.button
        return cell
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "thirdTableCell") as! ThirdTableCell
        // Set up cell.textField
        return cell
    }
}

6. Spróbuj :)

Tutaj wpisz opis obrazka

 24
Author: Fangming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-19 01:58:28

Powyższe odpowiedzi są najlepsze odpowiedzi, ale istnieje mnóstwo powodów, aby uzyskać ten problem. Oto inne potencjalne rozwiązanie dla każdego z tym problemem:

Moim problemem było to, że segueing do klasy ViewController, a nie Widok storyboard. Więc moje odniesienie do komórki storyboard było bez znaczenia, ponieważ storyboard nie był używany.

Robiłem to:

let viewControllerB = SubViewController()
viewControllerB.passedData = diseases[indexPath.row].name
navigationController?.pushViewController(viewControllerB, animated: true)

I musiałem zrobić coś takiego:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "SubViewStoryboardController") as! SubViewController
nextViewController.passedData = diseases[indexPath.row].name
self.present(nextViewController, animated:true, completion:nil)
Mam nadzieję, że to komuś pomoże.
 0
Author: Coltuxumab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-20 17:19:55

UITableViewController jest dziedziczeniem UIViewController, które już ma UITableviewDataSource & UITableviewDelegate zmapowane na siebie.

Możesz podklasować UITableViewController lub użyć TableView wewnątrz swojego ViewController. Następnie należy wdrożyć wymagane metody(cellForRowAtIndexPath and numberOfRowsInSection) które są zadeklarowane w UITableviewDataSource.

Również w storyboard musisz utworzyć prototypy komórek z unikalnym identyfikatorem.

Istnieją podstawowe typy komórek, z (Tytuł, podtytuł na przykład) - możesz z nich korzystać, jeśli nie potrzebujesz specjalnej konfiguracji.

Więc dla picker, tak, musisz stworzyć własną, niestandardową komórkę. Utwórz niezbędny selektor daty przechowywania klas UITableViewCell i upewnij się, że używasz delegate, aby odesłać pożądany wynik z powrotem do ViewController.

 -20
Author: siarheibrazil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 10:07:47