2013-06-10 2 views
1

У меня есть UIViewController с 2 tableviews:Проблемы с источником данных и tableviews

1- главный tableview, который показан в целом view controller

2- второй viewcontroller, который загружается в popup view.

Второй tableview показан на проводе cell основного tableview.

В зависимости от того, в каком месте находится cell, в popup view есть разные данные.

Я уже загрузил все данные в viewdidload и сохранил все в nsmutablearray, так что они готовы к загрузке.

Моя проблема заключается в том, что я не знаю, как работать с tableview «s DataSource, в моем проекте я связан как tableview» s источник данных для file's owner, но таким образом он загружает numberofrows от основной точки зрения, и его не принимает правильный счет, который должен иметь второй tableview.

Итак, если в основном tableview у меня есть, например, 3 элемента, а во втором tableview он должен загрузить 5 элементов, это дает мне ошибку, ('NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index…).

Я думаю, что я должен связать свой tableviews с разными datasource, даже если я действительно не знаю.

Надеюсь, что вам будет ясно, если вам нужна дополнительная информация или лучшее описание, спросите меня, и я сделаю это за вас.

ответ

0

Проблем нет

вы просто набор тегов таблиц.

[tableView1 setTag:1]; 
[tableView2 setTag:2]; 

, а затем

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    if (tableView.tag == 1) { 
     return 4; 
    } 
    else if (tableView.tag == 2) 
    { 
     return 5; 
    } 
} 

сделать подобную вещь весь метод источника данных

+0

Я бы рекомендовал не использовать теги, если вы можете избежать этого. –

+0

yup..you ответ намного лучше. –

+0

Идеально, с тегом я могу проверить лучше, чем с if (tableview == popuptableview) или другими вещами !! СПАСИБО!! – Bellots

2

В методе делегата вы должны сравнить табличное представление.

Смотрите пример,

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if(tableView == maintableView) 
      return VALUE_FOR_MAIN_TABLE_DATA; 
    else 
      return VALUE_FOR_POP_TABLE_DATA; 
} 
0

Вы можете использовать один View Controller, как уникальный источник данных для множественного представления таблицы, но вам нужно проверить в представлении таблицы запрашиваются данные с использованием аргументов tableView методов UITableViewDataSource.

Например:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (tableView == self.mainTableView) 
    { 
     // code for your main table view 
    } 
    else 
    { 
     // code for your popup table view 
    } 
} 
+0

вот что я сделал, и все в порядке, проблема в том, что я не знаю почему, но он не принимает правильное количество строк, которое должно загружаться. Если количество строк в всплывающем представлении таблицы меньше или равно основному представлению таблицы, то, если нет, оно сработает. if (tableView == PopupTableView) { return popupcounter; } else if (tableView == mainTableview) { return counter; } – Bellots

+0

Затем вы должны отправить соответствующие части кода, чтобы получить дополнительную помощь. –

0

Тот же экземпляр контроллера представления, служащий в качестве источника данных/делегата для двух таблиц технически возможно, но имеет ряд ловушек. Один из них: к какой из двух таблиц относится self.view?

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

Вы намного лучше с двумя отличительными контроллерами вида, по одному для каждой таблицы. Установите протокол между ними, чтобы главный контроллер представления мог передать данные в окно во всплывающем окне, чтобы всплывающее окно могло инициализировать/загрузить его самостоятельно с помощью правильных данных и обновить его представление, когда данные будут изменены.

0

Вам нужно будет проверить на Tableview во всех своих делегатов и DataSource методов следующим образом:

if (tableView == mainTable) 
{ 
    // code for your main table 
} 
else if (tableView == popupTable) 
{ 
    // code for your popup table 
} 

Вы делаете то же самое для 2-х или более видами таблиц. Надеюсь, это поможет.

0

Вы можете сделать это в обоих направлениях:

  1. Сделать отдельные классы в качестве источника данных для отдельных таблиц. Создайте объекты в качестве источников данных для таблиц и привяжите их к методу viewDidLoad в правильном представлении.

  2. Сделайте один источник данных для 2 таблиц, которые я не рекомендую, так как он не соответствует надлежащему OOAD. У вас будет жесткая связь таким образом между контроллером просмотра и таблицей, которая может стать причиной неприятностей в ближайшем будущем.

Вы метод - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

, в котором можно различить в какой таблице вы имеете в виду:

if (tableView == mainTableView) { 
    // initialize cell for main table view 
} 
if (tableView == secondTableView) { 
    // intialize cell for second table view 
} 
Смежные вопросы