Mam bardzo prostą podklasę UITextView, która dodaje funkcję „Placeholder”, którą można znaleźć natywną dla obiektu Text Field. Oto mój kod dla podklasy:
import UIKit
import Foundation
@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
@IBInspectable var placeholder: String = "" {
didSet {
setPlaceholderText()
}
}
private let placeholderColor: UIColor = UIColor.lightGrayColor()
private var textColorCache: UIColor!
override init(frame: CGRect) {
super.init(frame: frame)
self.delegate = self
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = self
}
func textViewDidBeginEditing(textView: UITextView) {
if textView.text == placeholder {
textView.text = ""
textView.textColor = textColorCache
}
}
func textViewDidEndEditing(textView: UITextView) {
if textView.text == "" && placeholder != "" {
setPlaceholderText()
}
}
func setPlaceholderText() {
if placeholder != "" {
if textColorCache == nil { textColorCache = self.textColor }
self.textColor = placeholderColor
self.text = placeholder
}
}
}
Po zmianie klasy UITextView
obiektu w Inspektorze tożsamości na PlaceholderTextView
, mogę dobrze ustawić Placeholder
właściwość w Inspektorze atrybutów. Kod działa świetnie podczas uruchamiania aplikacji, ale nie wyświetla tekstu zastępczego w konstruktorze interfejsu. Otrzymuję również następujące błędy nieblokujące (zakładam, że dlatego nie renderuje się w czasie projektowania):
błąd: IB Designables: Nie udało się zaktualizować stanu automatycznego układu: Awaria narzędzia Interface Builder Cocoa Touch Tool
błąd: IB Designables: nie udało się wyrenderować instancji PlaceholderTextView: Renderowanie widoku trwało dłużej niż 200 ms. Twój kod rysowania może mieć niską wydajność.
Nie jestem w stanie dowiedzieć się, co powoduje te błędy. Drugi błąd nie ma żadnego sensu, ponieważ nawet nie nadpisuję funkcji drawRect (). Jakieś pomysły?
źródło
Odpowiedzi:
Istnieją raporty o awariach generowane w przypadku awarii narzędzia Interface Builder Cocoa Touch Tool. Tezy są zlokalizowane
~/Library/Logs/DiagnosticReports
i nazwaneIBDesignablesAgentCocoaTouch_*.crash
. W moim przypadku zawierały one użyteczny ślad stosu, który zidentyfikował problem w moim kodzie.źródło
initFrame(frame: CGRect)
należy to zdefiniować. Zrób to, jeśli udostępniasz własneinit
metody.init(frame: CGRect)
jawnie nadpisać, ponieważ miałem niestandardowąini
metodę. Możesz przejrzeć raport o awariiuse of unimplemented initializer 'init(frame:)'
bezpośrednio podApplication Specific Information
raportem. Dzięki chłopaki! Podwójne zwycięstwo w tej odpowiedzi!Kilka razy miałem ten sam problem. Za każdym razem zaczęło się to, gdy ładowałem stalówkę IBDesignable na scenorys, gdy stalówka nie była w stanie zmieścić się w widoku (tj. Miałem przycisk poza UIView, ale nadal w stalówce). Kiedy naprawiłem, że Xcode nadal dawał mi błędy, uruchomiłem ponownie Xcode, aż losowo przestał dawać mi błąd.
Mam nadzieję, że to pomoże.
AKTUALIZACJA: Właśnie zabiłem wszystkie procesy o nazwie „Interface Builder Cocoa Touch Tool”, zrestartowałem Xcode i błąd zniknął. Nie wiem, czy to zawsze zadziała, czy nie.
źródło
init
metod, kod wysłany jako część pytania nie pokazuje jużIB Designables
błędów, a symbol zastępczy jest prawidłowo renderowany w programie Interface Builder.W moim przypadku robiłem następny w metodach initWithFrame / initWithCoder, aby utworzyć widok:
Wygląda na to, że nie powinienem używać pakietu głównego , ale pakiet klasy. Więc zamieniłem ten kod na następujący i zadziałał:
Pomyślałem, że może to komuś pomoże.
źródło
let bundle = Bundle(for: ValidatingTextField.self)
w SwiftMożesz wybrać widok niestandardowy w programie Interface Builder, a następnie użyć
Editor
,Debug Selected Views
. Uruchomi tak zwanąIBDesignableAgentCocoaTouch
sesję debugowania, gdy wszystkie punkty przerwania (w tym punkty przerwania wyjątków) będą działać i możesz dokładnie zidentyfikować miejsce awarii widoku.źródło
Dla Xcode 8 - Swift
Dodawanie opcjonalnej wartości jako wartości domyślnej
@IBInspectable
powodującej problem.To nie zadziała:
To powinno działać:
źródło
Doświadczyłem podobnych problemów z Interface Builder podczas renderowania projektów.
Korzystając z techniki zaproponowanej w tej odpowiedzi , udało mi się wyśledzić problem z użyciem literałów obrazu.
Błąd renderowania
Brak awarii renderowania
źródło
W rzeczywistości, jeśli masz jakieś stare atrybuty zdefiniowane przez użytkownika (które nie są ważne dla bieżącego widoku) w dowolnym widoku w swojej serii ujęć, może to spowodować awarię agenta.
Poza tym czasami dzieje się tak z powodu paskudnego błędu Xcode. Aby to sprawdzić, gdy jesteś w scenorysie, odznacz Edytor> Automatycznie odświeżaj widoki, a następnie przejdź do innego pliku, wyczyść i uruchom ponownie projekt. Po ponownym wejściu do scenorysu możesz kliknąć Edytor> Odśwież widoki i ponownie sprawdzić automatyczny. Ten też kiedyś rozwiązał mój problem.
Jeśli oba nie zadziałały, prawdopodobnie zrobiłeś coś złego w swoim widoku IBDesignable, więc wybierz swoje uszkodzone widoki w scenorysie i debuguj, klikając Edytor> Debuguj widoki
źródło
Tak nie jest w przypadku tego pytania, ale może pomogę komuś innemu.
Miałem podobny problem, gdy w mojej klasie @IBDesignable nie zaimplementowałem obu:
źródło
Miałem ten sam problem i rozwiązałem go, dodając 'use_frameworks!' do pliku Podfile mojego projektu.
Mam nadzieję, że ci to pomoże.
źródło
W moim przypadku było to w jakiś sposób związane z frameworkiem kartaginy, którego używałem. Musiałem dodać $ (PROJECT_DIR) / Carthage / Build / iOS do ustawienia kompilacji Runpath Search Paths
źródło
W moim przypadku był to problem z OneSignal. Najwyraźniej mają błąd w wersji 2.2.0 i nowszych. Przełączono na 2.1.6 i znowu wszystko jest świetnie!
Sprawdź to .
źródło
Kiedy to debugowałem, odkryłem, że istnieje kilka klas, które modyfikują interfejs użytkownika. Zwykle marquelabel, która jest podklasą UILabel lub dowolnej innej klasy podklasy UIView i rysowania interfejsu użytkownika w czasie wykonywania i koliduje z silnikiem Autolayout. Spróbuj podać stałą szerokość lub wysokość dla tych niestandardowych widoków. Jeśli to nie rozwiąże problemu, wypróbuj następujące rozwiązania: -
Rozwiązanie 1: - Usuń komentarz #use_frameworks z pliku pod.
Rozwiązanie 2: - Spróbuj usunąć dane pochodne. 1. Zamknij okno Edytora swojego Xcode i wyjdź z symulatora -> 2. Przejdź do Xcode Preferences -> Locations -> 3. Kliknij małą szarą strzałkę pokazującą wyprowadzoną ścieżkę danych -> 4. Wybierz swój projekt -> 5. Usuń wszystkie foldery wewnątrz -> 6. Zamknij Xcode i otwórz ponownie
źródło
Dodaj go na dole swojego pliku Podfile i uruchom
pod install
źródło
Dodaj ten skrypt na końcu mojego
Podfile
i wykonałempod install
ponownie.źródło
Głównym problemem jest to, że podczas tworzenia @ IBDesignable upewnij się, że plik cocoapod nie jest uwzględniony w UITestach, bo inaczej spowoduje to awarię.
źródło
Uważam, że powodem jest to, że twój xib nie jest tego samego rozmiaru co projekt w scenorysie. Upewnij się, że xib ma taką samą wysokość i szerokość.
źródło
Brakowało mi tej linii kodu
platform :ios, '7.0'
i problem został rozwiązany. Tylko ten wiersz w pliku poda i zaktualizuj problem z modułem zostanie rozwiązany.źródło
Dla mnie był to brakujący certyfikat do podpisywania, ponieważ nigdy nie uruchamiałem aplikacji, więc Xcode nie utworzył jeszcze certyfikatu. Po uruchomieniu aplikacji
IBDesignable
renderowanie działało dobrze.źródło
To tak, jakbyś miał kod od innego programisty i otrzymujesz ten błąd. Po prostu biegnij
To zadziałało dla mnie. Mam nadzieję, że to pomoże.
źródło
Upewnij się, że nie inicjujesz bezpośrednio
UIImage
aniUIFont
używasz zasobów lub czcionek dodanych w projekcie.Zawsze tworzę
private func setUp()
w moich@IBDesignable
własnychUI
klasach. która jest wywoływana zinit(frame: CGRect)
,init?(coder aDecoder: NSCoder)
. Więc w końcu zaktualizowałemsetup()
w następujący sposób.źródło
Po prostu pozwól mu zbudować i uruchomić na symulatorze, jeśli masz błąd w innym miejscu projektu, po prostu zakomentuj go i uruchom najpierw projektowalny, aby zaktualizować projektowalne i odkomentować inne kody. Mi to pasuje.
źródło