0

У меня есть пользовательский UIView, MyView, с несколькими табличными представлениями в нем - tv1 и tv2 - оба добавлены программно.ViewController как делегат табличного представления пользовательского вида

У меня есть пользовательский UIViewController, MyController, который создает экземпляр MyView для loadView.

Моя цель следующая. myView должен быть источником данных и делегировать для myView.tv1, так как он не касается моей модели данных и является статичным.

myController должен быть делегатом myView.tv2, поскольку его содержимое будет зависеть от источника данных.

Я добавил следующее к каждому заголовку:

@interface MyController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

@interface MyView : UIView <UITableViewDelegate, UITableViewDataSource> 

и добавляю к каждому необходимым методам делегата.

В INIT MyView, я добавить, что представления таблиц и установить делегат первого в себя:

tv1 = [[UITableView alloc] initWithFrame:frame1 style:UITableViewStyleGrouped]; 
tv1.delegate = self; 
tv1.datasource = self; 

tv2 = [[UITableView alloc] initWithFrame:frame2 style:UITableViewStyleGrouped]; 

И в моем контроллере я подключить второй TableView:

- (void)loadView{ 
self.view = [[MyView alloc] initWithFrame:myFrame]; 
[(MyView *)self.view tv2].delegate = self; 
[(MyView *)self.view tv2].dataSource = self; 
} 

Когда я запускаю это, я получаю полный беспорядок ошибок времени выполнения. Иногда он жалуется на пейджинговый контроль, в других случаях NSCFArray, в противном случае текст вообще отсутствует. Он всегда падает.

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

Что может привести к тому, что каждый раз я буду испытывать другую ошибку времени выполнения, и где я могу ошибиться?

+1

Получение сообщений об ошибках с ошибками, как правило (по моему опыту) имеет какое-то отношение к памяти. Вы пытались комментировать реализацию одного из табличных представлений и пытались просто заставить их работать 1 за раз? Если вы можете сузить его до тех пор, пока проблема с таблицей (или и тем, иная), это поможет разобраться в этом. – WendiKidd

+0

В дополнение к комментарию от @WendiKidd, смотрите, помогает ли статический анализатор. – Danra

+0

Спасибо. Я вижу много «[ numberOfSectionsInTableView:]: непризнанный селектор отправил сообщения, где пусто - __NSCFType, NCSFArray и т. Д. Я не уверен, с чего начать, поскольку я использую ARC. –

ответ

0

MyView должен быть DataSource и делегат myView.tv1, так как он не касается моей модели данных и является статическим

Это не совсем MVC, правильно?

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

Крайне важно сохранить ссылки делегата/источника данных, сохраненные владельцем таблицы, поскольку таблица не сохранит его сама (это может быть не так важно для случая, когда вы устанавливаете делегат/источник данных self как для таблицы1 (MyView) и table2 (MyController), но вам нужно помнить об этом, если вы создаете отдельный класс делегатов классов данных). В любом случае вам нужно сохранить array, который вы используете в качестве источника данных.

+0

Спасибо - как бы я сохранил табличное представление? Я использую ARC. Что касается MVC, это основная причина, по которой я управляю делегатом/источником данных для tv2 отдельно. tv1 просто обновляет его отображение на основе нажатий кнопок в пределах одного и того же представления, без ссылки на любые объекты данных и т. д. - этот код всегда будет одинаковым независимо от того, к какому контроллеру я подключаю представление, поэтому почему контроллер должен взять на себя ответственность за Это? –

+0

Я не использую ARC, но это должен быть аргумент 'strong', который нужно сделать ARC, чтобы взять собственность (@property (сильный, неатомный) NSObject * myString;). Что касается делегата 'table1', я не имею в виду, что его даже упоминают в' MyController', вы можете объявить его интерфейс и написать его реализацию на 'MyView.m', создать там экземпляр, сохранить его и установить делегат 'table1'. Инициализация 'table1' может быть завершена методом' MyView', объявленным в 'MyView.h', так что' MyController' ничего не знает об этом делетете. –

+0

Возможно, у нас есть перекрещенные провода. Tv1 полностью построен и контролируется внутри MyView, как вы предлагаете. MyController знает только о tv2. Я не использую свойство для определения tv2 на данный момент. –

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