Gniazda nie mogą być połączone z powtarzającymi się treściami iOS

144

Właśnie stworzyłem aplikację i zacząłem podłączać @ IBOutlet do storyboardu. Podłączam niektóre z nich do etykiet w komórce prototypowej UITableViewCell ze stylem podstawowym. Kiedy go podłączam, pojawia się ten błąd w Storyboard:

Wylot detailText z TableViewController do UILabel jest nieprawidłowy. Gniazda nie mogą być połączone z powtarzającymi się treściami.

Czy ktoś może mi pomóc? Skonfigurowałem to w sposób, w jaki zawsze robię to pomyślnie, ale tym razem wyrzucił mi ten błąd.

Tomblasta
źródło
54
Nie możesz podłączyć etykiety w komórce prototypowej do IBOutlet w podklasie UIViewController - musisz podłączyć ją do IBOutlet w podklasie UITableviewCell.
Paulw11,
Ok dzięki! :) Więc po prostu zrozumiem: czy możesz wyjaśnić dlaczego?
Tomblasta,
3
Ponieważ możesz mieć dowolną liczbę komórek i tylko jeden kontroler widoku - więc która etykieta komórki powinna być połączona z kontrolerami widoku IBOutlet?
Paulw11
Ok, więc dlaczego nie mógłbyś po prostu użyć cellForRowAtIndexPath dla tekstu komórki w jednym kontrolerze widoku? Dzięki!
Tomblasta,
3
Ponieważ gniazda są powiązane z obiektami (takimi jak etykiety), gdy kontroler widoku jest załadowany - W tym momencie nie ma komórek, więc nie ma etykiety do powiązania, a jeśli były komórki, które chcesz powiązać
Paulw11

Odpowiedzi:

168

Utwórz podklasę komórki widoku tabeli i ustaw ją jako klasę prototypu. Dodaj gniazda do tej klasy i połącz je. Teraz po skonfigurowaniu komórki masz dostęp do gniazd.

Fura
źródło
9
@ Czy mógłbyś dodać więcej informacji na temat dostępu do tych punktów sprzedaży?
Juan Boero
1
Juan Pablo - Mówi, że normalne jest używanie niestandardowej komórki widoku tabeli. Nie możesz ustawić wyjścia dla ograniczenia w widoku, w którym używasz komórki, zamiast tego musisz to zrobić na przykład w cellForRowAtIndexPath - customCell.constraint_row_width.constant = 25.0;
Stuart P.
70

Istnieją dwa rodzaje komórek widoków tabeli udostępnionych za pośrednictwem scenorysu, są to dynamiczne prototypy i statyczne komórki

wprowadź opis obrazu tutaj

1. Dynamiczne prototypy

Z nazwy ten typ komórki jest generowany dynamicznie. Są kontrolowane przez Twój kod, a nie scenorys. Za pomocą delegata widoku tabeli i źródła danych można programowo określić liczbę komórek, wysokość komórek, prototyp komórek.

Kiedy przeciągasz komórkę do widoku tabeli, deklarujesz prototyp komórek. Następnie możesz utworzyć dowolną liczbę komórek na podstawie tego prototypu i dodać je do widoku tabelicellForRow metody, programowo. Zaletą tego jest to, że wystarczy zdefiniować tylko 1 prototyp zamiast tworzyć każdą komórkę ze wszystkimi widokami dodanymi do nich samodzielnie (patrz komórka statyczna).

W tym przypadku nie możesz połączyć elementów UI prototypu komórki z kontrolerem widoku. Zainicjowany zostanie tylko jeden obiekt kontrolera widoku, ale może być zainicjowanych i dodanych do widoku tabeli wiele obiektów komórek. Nie ma sensu podłączanie prototypu komórki do kontrolera widoku, ponieważ nie można sterować wieloma komórkami za pomocą jednego połączenia kontrolera widoku. Jeśli to zrobisz, pojawi się błąd.

wprowadź opis obrazu tutaj

Aby rozwiązać ten problem, musisz podłączyć prototypową etykietę do UITableViewCellobiektu. A UITableViewCelljest również prototypem komórek i możesz zainicjować dowolną liczbę obiektów komórek, a każdy z nich jest następnie połączony z widokiem generowanym z prototypu komórki tabeli scenorysu.

wprowadź opis obrazu tutaj

Na koniec w swojej cellForRowmetodzie utwórz niestandardową komórkę z UITableViewCellklasy i rób fajne rzeczy z etykietą

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. Komórki statyczne

Z drugiej strony, statyczne komórki są rzeczywiście konfigurowane za pomocą scenorysu. Aby je utworzyć, musisz przeciągnąć elementy UI do każdej komórki. Będziesz kontrolować numery komórek, wysokości itp. Z serii ujęć. W takim przypadku zobaczysz widok tabeli, który jest dokładnie taki sam z telefonu w porównaniu z tym, co utworzyłeś z serii ujęć. Do ustawiania strony częściej używane są komórki statyczne, których komórki niewiele się zmieniają.

Aby kontrolować elementy interfejsu użytkownika dla statycznej komórki, rzeczywiście będziesz musiał podłączyć je bezpośrednio do kontrolera widoku i skonfigurować.

wprowadź opis obrazu tutaj

Fangming
źródło
@FangmingNing w moim kodzie, nadal nie mogę zmienić etykiety tekstowej, podłączyłem klasę do komórki, nazwałem poprawną komórkę z identyfikatorem, ale nadal się nie zmieniam
jorge saraiva
@jorgesaraiva Porozmawiajmy o tym na czacie chat.stackoverflow.com/rooms/159396/discuss
Fangming
Brakowało mi jak! YourCell . +100
Daniel Springer
Zawsze dobrze jest mieć trochę odświeżenia po pracy nad projektem w samym kodzie przez 6 miesięcy.
ttorbik
Dzięki, mój problem polega na tym, że podłączam go do ViewController, a nie do komórki.
Stella
23

Jeśli używasz widoku tabeli do wyświetlania ustawień i innych opcji (tak jak robi to wbudowana aplikacja Ustawienia), możesz ustawić zawartość widoku tabeli na komórki statyczne w Inspektorze atrybutów . Ponadto, aby to zrobić, musisz osadzić widok tabeli w wystąpieniu UITableViewController.

Justin Domnitz
źródło
Jest to o wiele prostsze i szybsze i powinno być akceptowaną odpowiedzią imho
Jaime Agudo
5

Lub nie musisz używać IBOutlet do odwoływania się do obiektu w widoku. Możesz nadać Label w tableViewCell wartość Tag, na przykład ustawić Tag na 123 (może to zrobić inspektor atrybutów). Następnie możesz uzyskać dostęp do etykiety przez

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}
SLN
źródło
bardzo łatwe i proste! +100
Julian Silvestri
1

Ze mną mam UIViewcontroller, a do niego mam widok tabeli z niestandardową komórką. Mapuję moje gniazdko UILabel na, UItableviewcella UIViewControllernastępnie otrzymałem błąd.

zawietrzny
źródło
utwórz niestandardową klasę komórki i utwórz instancję iboutlet w tej niestandardowej klasie
Shauket Sheikh
0

Jak zauważyła większość ludzi, tworzenie podklas UITableViewCell rozwiązuje ten problem. Ale powód jest niedozwolony, ponieważ komórka prototypowa ( UITableViewCell ) jest zdefiniowana przez Apple i nie możesz dodać do niej żadnego własnego gniazdka.

Nikhil Muskur
źródło
0

Czasami Xcode nie mógł kontrolować prawidłowego połączenia gniazda komórki.

W jakiś sposób etykieta / przycisk mojej obecnej komórki połączył inną komórkę. Po prostu je usuwam i błąd znika.

Shourob Datta
źródło
-1

Kliknij symulator, przejdź do okna i włącz ramki urządzeń

automatyka inż
źródło