2013-03-14 3 views
1

Все находится в раскадровке, используя довольно стандартную компоновку. Storyboard pictureviewDidLoad не называется

UISplitViewController с контроллером деталировка UINavigationController, который загружает мой обычай UITableViewController. Только viewDidLoad в обычном UITableViewController никогда не срабатывает.

viewWillAppear срабатывает, как и ожидалось, и все остальное работает отлично. Вид явно загружен (единственное, что не работает, - это уведомления, которые я устанавливаю в viewDidLoad), где мой обратный вызов?

Мой viewDidLoad метод ... viewDidLoad code Breakpoint, NSLog ... нет никакого способа, эти вещи не дали бы мне обратную связь, если этот метод выполняется.

+0

Что произойдет, если вы подключите контроллер подробного представления непосредственно к UITableVC. Увеличивает ли viewDidLoad в UITableVC? – Spectravideo328

+0

Я просто вытащил 'UINavigationController' и это не повлияло на проблему' viewDidLoad'. – DBD

+1

Это похоже на пользовательский TableView. Вы подклассифицировали TableView, заменив табличное представление по умолчанию, а затем изменили класс в IB для TableView и UITableVC и убедились, что соединения UITableVC для TableView верны. И если они есть, я бы рекомендовал разбить соединения, сделать проект чистым и снова подключить Table VC к просмотрам. – Spectravideo328

ответ

3

Я попытался пересоздать свою раскадровку, создав новый проект, используя шаблон Split View. Затем копирование всех соответствующих контроллеров View. Он работал, как ожидалось. (viewDidLoad называется нормально).

Я сравнивал все мои связи IB между проектами бок о бок ... нет разницы. Затем я взял свой первоначальный проект и удалил все соединения один за другим, затем повторно связал их (к тому же самому, к чему они были подключены). Когда я закончил, я запустил код, и все сработало. viewDidLoad называется.

Я попытался сделать разницу между нерабочей версией раскадровки и рабочей, потому что ничего не должно было быть иначе, но, очевидно, что-то было. Я не мог сделать из него головы или хвосты. Хотя большая часть XML была идентичной, многие биты были разными частями XML-файла, что сделало стандартный diff нереалистичным. Это больше похоже на головоломку, пытаясь найти, где биты совпадают друг с другом, и я бросил после часа ничего не обнаружил.

Так ужасно неутешительный ответ. Это было связано с IB, скорее всего, с выходами (но я снова переименовал имена классов и прочее) снова идентично). Скорее всего, это была моя ошибка, а не Xcode, но это не похоже на то, что я смогу точно указать причину.

Спасибо за предложения, они помогли мне посмотреть в разных направлениях, которые приводят к решению.

+0

Я тоже это переживаю. Я все еще пытаюсь отследить проблему, но первые признаки указывают на среду MediaPlayer. У меня есть только один стандартный контроллер представлений в корне раскадровки - шаблон приложения Xcode Single View (для iPad). Я добавил один подкласс View, который зависит от MediaPlayer и MobileCoreServices, и внезапно viewDidLoad не вызывается в классе контроллера корневого представления. Я удалил как фреймворки, так и зависимости, и вызвал viewDidLoad. Пробовал добавлять MobileCoreServices самостоятельно, никаких проблем. Попробовал добавить MediaPlayer, и проблема снова появилась. Тестирование на сим. – kball

+0

Такое же поведение на устройстве. Xcode 4.6.2, LLVM 4.2 – kball

+0

Я не совсем уверен, что «рамки и зависимости» полностью влекут за собой. Рамки не должны иметь никакого отношения. Добавление в выражения 'import' из структуры не имеет значения. Что такое изменения? Если вы меняете «родителей» контроллеров представлений, убедитесь, что каждый класс в цепочке запоминает вызов '[super viewDidLoad];' – DBD

1

Я подозреваю, что вы ожидаете, что viewDidLoad будет вызываться, когда он уже был загружен и только что обновлен, возможно, с главного контроллера. В этом случае его не нужно было бы перезагружать из nib/раскадровки, и поэтому viewDidLoad не будет вызываться.

Положите оператор журнала в viewDidLoad, и вы увидите, что он называется хотя бы один раз.

+0

У меня есть «NSLog» и точка останова, установленная в методе 'viewDidLoad'. Его никогда не называют. Вызывается «initWithCoder», вызываемый «viewWillAppear», но «viewDidLoad» просто не происходит. – DBD

+1

Из документации: «* Этот метод вызывается независимо от того, была ли иерархия представлений загружена из файла nib или создана программно в методе loadView. *« Возможно, у вас есть несколько похожих VC в вашем проекте и их смешивание? – Mundi

+0

Сомневаюсь, так как у меня только 3 пользовательских контроллера вида. 'MasterViewController',' DetailViewController' и 'AttachmentViewController'. Эта вещь в значительной степени является шаблоном Split View с по умолчанию 'DetailViewController', превращенным в' UITableViewController', последний из которых является всего лишь переходом на ячейки. Думаю, я попробую пересоздать шаблон и отбросить свои классы и посмотреть, что произойдет. – DBD

1

Убедитесь, что имя вашего подкласса контроллера вида не сталкивается с другим классом.

В моем случае я рассеянно сохранил префикс класса сгенерированный автопроизведением класса «МП», и поэтому подкласс подпрограмм корневого представления проекта был MPViewController.

MPViewController не документирован нигде, но поскольку проблема возникла только при связывании с картой MediaPlayer, вероятно, это безопасная ставка, что она определена где-то и когда была загружена раскадровка, приложение создало экземпляр этого приложения вместо экземпляра моего пользовательский класс.

1

Возможно, вы создали файл раскадровки после создания проекта. Если это так, вы должны удалить строки из файла AppDelegate.m:

self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen])];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

Смежные вопросы