Совместное использование данных между таблицами iPhone? - PullRequest
1 голос
/ 13 января 2012

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

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];
    ApplicationAppDelegate *appDelegate = (ApplicationAppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.rowPicked = row;
    SecondLevelViewController *nextController = [self.controllers objectAtIndex:row];
    [self.navigationController pushViewController:nextController animated:YES];
}

В приложении-делегате я сделал это и синтезировал его в файле .m:

   @property (nonatomic) NSInteger rowPicked;

Как и другие NSIntegers, которые мне были нужны. Какие-либо предложения? Если вы думаете, что я делаю это совершенно неправильно, не могли бы вы, пожалуйста, просветить меня конкретными инструкциями или ссылкой на сайт или видеоурок? Спасибо всем!

Ответы [ 2 ]

1 голос
/ 13 января 2012

Вот как я обычно это делаю:

  • Я не использую AppDelegate для этого.Логика и данные модели для списка и деталей должны располагаться в классах, которые имеют смысл.В этом случае мы будем использовать сами классы контроллера списка и подробного представления.
  • Я начну с создания подкласса UITableViewCell для строки представления списка.В этом подклассе я создам ивар, в котором размещается «сущность» или любые другие данные, необходимые ячейке для отображения ее информации.Это может быть NSManagedObject или даже NSDictionary.
  • . Я переопределю установщик этого ивара, так что когда данные установлены на UITableViewCell, он обновляет выходы ячеек для правильного отображения,Обратите внимание, как я сохраняю логику отображения ячейки полностью внутри подкласса.Важно, чтобы вы делали подобные вещи во всем приложении, чтобы обеспечить чистоту и организацию кода.
  • В вашем методе tableView:didSelectRowAtIndexPath вы бы затем вызвали метод класса cellForRowAtIndexPath: класса UITableView, чтобы вернуть ячейку, которая былавыбран.Затем вы можете привести его к вашему подклассу UITableViewCell и получить информацию о сущности, которую вы установили ранее.
  • Затем вам нужно будет создать ivar в вашем контроллере подробного представления.Вы захотите установить эту переменную из метода tableView:didSelectRowAtIndexPath: - прямо перед тем, как помещать детальное представление в стек.
  • Теперь у вас должны быть необходимые данные в подклассе контроллера детального представления для обработки,запрос или что-то еще.

Надеюсь, это помогло!

0 голосов
/ 13 января 2012

Это действительно выглядит плохо.Намного лучше добавить id<$YOUR_PROTOCOL> delegate к SecondLevelViewcontroller и установить nextController.delegate = self.Протокол может выглядеть так:

@protocol RowAccessProtocol
@optional
-(NSUInteger)selectedRow;
@end

Ваш текущий tableViewController должен быть создан:

@protocol RowAccessProtocol;
@class FirstLevelTableViewController:UITableViewController<RowAccessProtocol>
…
@end

И реализация:

…
-(NSUInteger)selectedRow{
return [self.tableView indexPathForSelectedRow].row;
}

В SecondLevelViewController вы можете вызвать [self.delegate selectedRow] дляполучить выбранную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...