#iphone #objective-c #uitableview #uinavigationcontroller #uinavigationbar
#iPhone #objective-c #uitableview #uinavigationcontroller #панель навигации
Вопрос:
/*****ОБНОВЛЕНО*****/
r.com/YH3cm.png
Я пытаюсь выяснить на изображении выше, как мы узнаем, выбрал ли пользователь дату или трек. / ОБНОВЛЕНО / Данные, которые я получаю, передаются с помощью запроса select, и я создаю массив для хранения списка. Он динамический и необязательно ограничен двумя полями, в нем также может быть 10 полей. Как я узнаю, какая строка выбрана, и как я перенесу данные в следующий просмотр.
Как и в didSelectRowAtIndexPath, как я должен нажимать поле date или track в следующем представлении?
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (dvController == nil)
dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
Teat *obj = [appDelegate.coffeeArray objectAtIndex:indexPath.row];
dvController.obj = obj;
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:dvController animated:YES];
}
Ответ №1:
Все еще не очень понятно, что вы пытаетесь сделать. Если вы хотите нажать определенный контроллер view в зависимости от содержимого ячейки, но нет определенного расположения строк, я бы использовал индекс строки для доступа к массиву, который является источником ваших данных. Какой-то очень расплывчатый код:
WhateverObject* selectedObject= (WhateverObject*)[tableDataSourceArray objectAtIndex:indexPath.row];
if( [selectedObject hasAnAttributeYouCareAbout] )
{
MyViewController* theCorrectController= whicheverViewControllerYouWant;
theCorrectController.anAttribute= aValue;
[self.navigationController pushViewController:theCorrectController animated:YES];
}
И вот как вы можете определить свой UIViewController
подкласс MyViewController
с определенными атрибутами. В файле .h:
@interface MyViewController : UIViewController {
int anAttribute;
}
@property int anAttribute
@end
В файле .m:
@implementation MyViewController
@synthesize anAttribute;
@end
У вас может быть столько атрибутов любого типа, сколько вы хотите, а затем вы можете установить их с помощью aViewController.anAttribute
, как указано выше.
Комментарии:
1. Привет, Люк, я обновил описание выше. Итак, когда я выбираю первую строку, я получаю информацию о дате с датами на следующей странице. Я использую запрос select, чтобы получить информацию для списка. Теперь, когда я выбираю первую дату, он должен добавить информацию о дате вместе с другой информацией, чтобы получить информацию о дате. Чтобы получить список сеансов, я создаю другой запрос select для извлечения информации с использованием выбранной даты. Моя главная проблема заключается в том, как я могу передать информацию в другое представление, чтобы выполнить запрос select по этой переменной date. поскольку я могу управлять только тем, какое представление передавать, а не данными.
2. Для этого я бы выделил подкласс UIViewController с переменными-членами для данных, которые вы хотели бы сохранить. В приведенном выше операторе if вы могли бы просто установить их в качестве свойств, прежде чем нажимать view controller.
3. о .. спасибо, но я немного новичок в этой области. Возможно ли, чтобы вы предоставили мне пример, например, как я могу создать подкласс UIViewController с переменными-членами и установить их в качестве свойств?
4. эй, Люк, извини, чувак, что пришлось прерваться на этом месте, так как некоторое время путешествовал. спасибо за обновления. но у меня небольшой вопрос. что происходит в вашем коде?
5. Это может быть все, что вы хотите. Предположительно, это было бы по-разному в каждом операторе ‘if’.
Ответ №2:
Создайте объекты — dateInfoViewController и trackInfoViewController, а затем…
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger row = [indexPath row];
if (row==0)
{
if (self.dateInfoViewController == nil)
{
DateInfoViewController *temp = [[DateInfoViewController alloc] init];
self.dateInfoViewController = temp;
[temp release];
}
else {
dateInfoViewController.title= [ NSString stringWithFormat:@"%@", [sessionInfoDetailsArray objectAtIndex:row]];
YourAppDelegate *delegate = [[UIApplication sharedApplication]delegate];
[delegate.sessionNavigationController pushViewController:dateInfoViewController animated:YES];
}
}
if (row==1)
{
if (self.vetInfoViewController == nil)
{
TrackInfoViewController *temp = [[TrackInfoViewController alloc] init];
self.trackInfoViewController = temp;
[temp release];
}
else {
trackInfoViewController.title= [ NSString stringWithFormat:@"%@", [sessionInfoDetailsArray objectAtIndex:row]];
YourAppDelegate *delegate = [[UIApplication sharedApplication]delegate];
[delegate.sessionNavigationController pushViewController:trackInfoViewController animated:YES];
}
}
Комментарии:
1. Поскольку список динамический, он не ограничен 1, или 2, или 3. Это зависит от данных и длины массива. таким образом, в таком случае статическое определение строки не будет работать. как я могу придумать что-то динамическое и правильно нажать view controller.
2. Если список динамический, ВЫ НЕ СМОЖЕТЕ ДИНАМИЧЕСКИ СОЗДАВАТЬ НОВЫЕ ПРЕДСТАВЛЕНИЯ ДЛЯ НОВЫХ СТРОК. Я предполагаю, что вы хотели бы использовать те же строки.. это логика.
3. На самом деле, у меня есть запрос, который извлекает данные из базы данных и сохраняет в таблице, и я пишу запрос, чтобы извлечь данные для получения информации. У меня также есть аналогичный запрос для извлечения информации для следующего просмотра в зависимости от даты. но мне нужно знать, выбрал ли пользователь дату в качестве строки, чтобы вызвать правильный запрос. как я могу вызвать правильный запрос wrt к выбранной строке, который затем?
Ответ №3:
Боюсь, не совсем ясно, что вы хотите сделать … если вам нужно настроить другой вид в зависимости от выбранной строки, вы можете просто сделать что-то вроде
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0)
//push view 1
else
//push view 2
}
ОБНОВЛЕНИЕ: вызывая indexPath.row
, вы получаете индекс выбранной строки. Я думаю, вам решать, что делать, в зависимости от того, какая строка выбрана. Чтобы передать эту информацию следующему просмотру, вы можете просто подумать о @property
поле для установки, методе для вызова или пользовательском методе инициализации для контроллера просмотра, который вы запускаете. В чем проблема с опубликованным вами кодом?
Комментарии:
1. Я обновил свой вопрос. Я знаю, что могу использовать indexpath.row, но допустим, если он динамический, как вы перенесете эти данные в следующий просмотр?
2. Обновлен ответ. Боюсь, я не могу сказать больше, не зная точно, что вы хотите сделать…