Ostrzeżenie dotyczące scenorysu: komórki tabeli prototypów muszą mieć identyfikatory ponownego wykorzystania

123

Otrzymuję to ostrzeżenie od scenorysu - komórki tabeli prototypów muszą mieć identyfikatory ponownego wykorzystania.

Zmieniłem nazwę identyfikatora w inspektorze atrybutów, ale wygląda na to, że nie usunęło ostrzeżenia.

Jakieś sugestie?

K.Honda
źródło
Wypełniłeś niewłaściwe pole lub masz więcej niż jeden widok tabeli. Czy możesz opublikować zrzut ekranu inspektora atrybutów?
jrturton
3
Teraz jest ok, stary. Znalazłem rozwiązanie. Wartość identyfikatora powinna być taka sama jak identyfikator ponownego wykorzystania. :)
K.Honda
Czy ustawiłeś identyfikator dla każdej komórki?
Mick MacCallum
Cześć Honda! Czy mógłbyś mi powiedzieć, co zrobiłeś, ponieważ otrzymuję ten sam błąd.
Varun Mehta
2
Zauważyłem, że czasami (obecnie używam najnowszej wersji Xcode 5 Beta 5 (5B103i)) zaznacza nieprawidłowe lokalizacje błędu / ostrzeżenia w scenorysie. Jeśli więc klikniesz ostrzeżenie, czasami pokaże ono niewłaściwą lokalizację, w której podobne ostrzeżenie można już naprawić. Proponuję ręcznie przejrzeć dowolne widoki tabeli, które masz w swojej serii ujęć i sprawdzić, czy są jakieś inne komórki z brakującym identyfikatorem. Powyższe rozwiązało mój problem z tym ostrzeżeniem. Dzięki @ K.Honda za zadanie pytania, ponieważ ten temat pomógł mi zrozumieć, jak rozwiązać problem.
Justas

Odpowiedzi:

159

Aby wyłączyć ostrzeżenie, musisz nadać nazwę identyfikatorowi komórki:

wprowadź opis obrazu tutaj

aleroot
źródło
14
mi się przydarzyło. zamknij xcode - otwórz go, a następnie zmień identyfikator
Idan Magled
7
Gdy ostrzeżenie pozostaje, oznacza to, że gdzieś na Twoim StoryBoard nadal znajduje się komórka bez identyfikatora
saimonx
Jeśli masz więcej niż 1 prototypową komórkę, musisz nadać im wszystkim identyfikator, w przeciwnym razie po prostu ustaw liczbę na jeden w komórce prototypowej
user1700737
6
Musiałem usunąć folder Derived Data (odpowiednik Xcode w przypadku ponownego uruchomienia systemu Windows) i odbudować, aby pozbyć się tego fałszywego ostrzeżenia.
Michael McGuire,
To zadziałało dla mnie: zamknij Xcode, otwórz / Users / username / Library / Developer / Xcode / DerivedData w Finderze i usuń całą jego zawartość (nie sam folder DerivedData).
dldnh
18

Innym sposobem jest ustawienie właściwości 'Prototype Cells' widoku tabeli na zero w Attributes Inspector, jeśli definiujesz komórkę programowo za pomocą .xib.

Ustawienie komórek prototypu na 0 w Inspektorze atrybutów

bitsand
źródło
9

Ponieważ storyboard jest w rzeczywistości plikiem XML, kolejną sztuczką jest otwarcie storyboardu za pomocą dowolnego edytora tekstu (nie Xcode!) I spróbuj znaleźć wszystkie węzły tableViewCell. Na przykład naciśnij CMD + F , wpisz <tableViewCell contentMode="scaleToFill"i naciśnij Enter. Prawdopodobnie dowiesz się, wiersze takie same jak w tym:

<tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="GenericCellID" id="kBr-Qn-Tki">

Proszę zwrócić uwagę na reuseIdentifier="GenericCellID"kluczową wartość. Wiersze, które uruchamiają ostrzeżenie (bez identyfikatorów ponownego wykorzystania), nie będą miały takiej wartości klucza. Spójrz na węzły powyżej w edytorze tekstu, a zobaczysz tableViewControllerwęzeł z nazwą klasy, którą musisz sprawdzić w edytorze scenariuszy Xcode i naprawić, zgodnie z odpowiedzią aleroot.

Dmitry Varavkin
źródło
1
Możesz faktycznie otworzyć swoją storyboard jako kod za pomocą Xcode, wykonując CTRL + kliknij plik storyboardu Open As>>Source Code
NSTJ
4

Jeśli ostrzeżenie Xcode nadal nie znika nawet po ustawieniu reuseIdentifier, wypróbuj Menu "Produkt -> Wyczyść". Pomogło mi to i po tym ostrzeżenie już się nie pojawiało.

Marcel Wassmer
źródło
2

Ponieważ dwukrotne kliknięcie tego ostrzeżenia może prowadzić do odrobiny dzikiego pościgu za gęsią skórką (konkretny UITableViewCell nie jest wybierany), chciałem tylko dodać, że chociaż niektóre z tych ostrzeżeń zostaną automatycznie rozwiązane, niektóre nie .

Jeśli masz pewność, że oznaczyłeś wszystkie swoje komórki w Storyboard, odbuduj projekt - Twoje ostrzeżenie może zniknąć (tak jak moje).

Sitric
źródło
2

Zdrowaś Maryjo: ponowne uruchomienie XCode zadziałało dla mnie (ale prawdopodobnie była to tylko ręczna przebudowa, która była wymagana).

Hannele
źródło
1

Otrzymałem to ostrzeżenie dla Xcode 7. Pracuję z Swift. Nie dodałem kontrolera nawigacji do początkowego kontrolera widoku. Kiedy to zrobiłem… dostałem ostrzeżenie od StoryBoard. To co zrobiłem to:

  1. Istnieją dwa odcinki
    1. z kontrolera nawigacji do głównego kontrolera widoku i
    2. z głównego kontrolera widoku do początkowego kontrolera widoku.
  2. Wybierz przejście łączące główny kontroler widoku z początkowym kontrolerem widoku.
  3. Nazwij identyfikator
  4. Wybierz zapisaną część kontrolera „Prototyp” -> tam zobaczysz identyfikator jako opcję.
  5. Wklej tę samą nazwę identyfikatora, jaką wprowadziłeś wcześniej.

Ostrzeżenie idzie ... jeśli nie wyczyść sdk :)

Mili
źródło
1

Upewnij się, że ustawiasz identyfikator ponownego użycia na obiekcie, a nie identyfikator przywrócenia . Oba są dostępne za pośrednictwem scenorysu i łatwo je pomylić.

W pliku XML scenorysu, które chcesz ustawić reuseIdentifier, nie restorationIdentifier.

pkamb
źródło
0

Zauważyłem, że ten błąd występuje, gdy masz wiele komórek prototypowych (we właściwościach widoku tabeli) i nie nadałeś im wszystkich identyfikatorów ponownego wykorzystania.

Tjalsma
źródło
Też to widziałem, czy istnieje sposób na nazwanie wszystkich komórek naraz, czy jest inny sposób na usunięcie tych ostrzeżeń?
CatsLoveJazz
1
Każda komórka Prototye potrzebuje własnej unikalnej nazwy. Więc nie ma sposobu, aby zrobić to automatycznie
Vincent,
0

Identyfikator to nazwa, do której się odnosisz w swoim pliku .m. Gdy nie jest wypełniona, nie można odwołać się do komórki.

Vincent
źródło
0

To do ustawiania identyfikatora ponownego wykorzystania przez programowe

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath*)indexPath 
{
    static NSString *cellIdentifier = @"wot";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (!cell)
        cell = [[UITableViewCell alloc] initWithStyle: someStyle reuseIdentifier: cellIdentifier];

    return cell;
}
Mukesh
źródło