Как нажать view в зависимости от выбора строки?

#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. Обновлен ответ. Боюсь, я не могу сказать больше, не зная точно, что вы хотите сделать…