2013-08-03 3 views
1

У меня есть UITableView, в котором перечислены некоторые кафе в этом районе. Данные для каждого кафе извлекаются из базы данных MySQL. Когда пользователь нажимает на кафе (ячейку), он предоставляет пользователю подробное представление. В настоящее время пользователи могут «любить» кафе, щелкнув по звездообразному изображению в каждой ячейке (это добавляет избранную ячейку в избранноеTableView). Тем не менее, я хочу, чтобы пользователи могли добавлять кафе в FavoritesTableView из DetailView (другими словами, «любимое» кафе из DetailView). Кто-нибудь знает, как я буду реализовывать это?Добавить ячейку в «Избранное» TableView из DetailView

Прямо сейчас, у меня есть кнопка звезда на месте в моих DetailView.m (кафе) Подробное описание:

- (IBAction)buttonpressed:(UIButton *)fave { 
    if (!checked) { 
     [checkedButton setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
     checked = YES; 

    } 

    else if (checked) { 
     [checkedButton setImage:[UIImage imageNamed:@"unchecked.png"] forState:UIControlStateNormal]; 
     checked = NO; 
    } 

} 

ViewController.m (кафе TableView)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *strainTableIdentifier = @"StrainTableCell"; 

    StrainTableCell *cell = (StrainTableCell *)[tableView dequeueReusableCellWithIdentifier:strainTableIdentifier]; 
    if (cell == nil) 


    cell = [[StrainTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strainTableIdentifier]; 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    cell.selectionStyle = UITableViewCellSelectionStyleBlue; 



    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"StrainTableCell" owner:self options:nil]; 
    cell = [nib objectAtIndex:0]; 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     NSLog(@"Using the search results"); 

     cell.titleLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
     cell.descriptionLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Description"]; 
     cell.ratingLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Rating"]; 
     cell.ailmentLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Ailment"]; 
     cell.actionLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Action"]; 
     cell.ingestLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Ingestion"]; 

     NSLog(@"%@", searchResults); 



    } else { 
     NSLog(@"Using the FULL LIST!!"); 
     cell.titleLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
     cell.descriptionLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Description"]; 
     cell.ratingLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Rating"]; 
     cell.ailmentLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Ailment"]; 
     cell.actionLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Action"]; 
     cell.ingestLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Ingestion"]; 

    } 


    NSMutableDictionary *item = [Strains objectAtIndex:indexPath.row]; 
    cell.textLabel.text = [item objectForKey:@"text"]; 

    [item setObject:cell forKey:@"StrainTableCell"]; 
    BOOL checked = [[item objectForKey:@"checked"] boolValue]; 

    NSLog(@"%i",checked); 
    UIImage *image = (checked) ? [UIImage imageNamed:@"checked.png"] : [UIImage imageNamed:@"unchecked.png"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    CGRect frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
    button.frame = frame; 
    [button setBackgroundImage:image forState:UIControlStateNormal]; 
    [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
    button.backgroundColor = [UIColor clearColor]; 
    cell.accessoryView = button; 

    return cell; 


} 


- (void)checkButtonTapped:(id)sender event:(id)event 
{ 
    NSLog(@"made it here and event is %@",event); 

    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.StrainTableView]; 
    NSIndexPath * indexPath ; 
    indexPath = [self.StrainTableView indexPathForRowAtPoint: currentTouchPosition]; 
    NSLog(@"indexpath is below"); 
    NSLog(@"%@",indexPath); 
    if (indexPath != Nil) 
    { 

     NSMutableDictionary *item = [Strains objectAtIndex:indexPath.row]; 
     BOOL isItChecked = [[item objectForKey:@"checked"] boolValue]; 

NSMutableArray *quickArray = [[NSMutableArray alloc] initWithArray:Strains]; 
     [quickArray replaceObjectAtIndex:indexPath.row withObject:item]; 


     [item setObject:[NSNumber numberWithBool:!isItChecked] forKey:@"checked"]; 
     Strains = [quickArray copy]; 

[StrainTableView reloadData]; 

    } 

} 

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 



     StrainDetailViewController *detailViewController = [[StrainDetailViewController alloc] initWithNibName:@"StrainDetailViewController" bundle:nil]; if ([searchResults count]) { 

      detailViewController.title = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
      detailViewController.strainDetail = [searchResults objectAtIndex:indexPath.row]; 

     } else { 

      detailViewController.title = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
      detailViewController.strainDetail = [Strains objectAtIndex:indexPath.row]; 
      NSLog(@"%@", Strains); 
     } 


     [self.navigationController pushViewController:detailViewController animated:YES]; 



     // Release any retained subviews of the main view. 
     // e.g. self.myOutlet = nil; 
    } 


    - (void)viewWillAppear:(BOOL)animated 
    { 
     [super viewWillAppear:animated]; 

     if ([[NSUserDefaults standardUserDefaults] objectForKey:@"strains"] != Nil) { 


      NSData *dataSave = [[NSUserDefaults standardUserDefaults] objectForKey:@"strains"]; 
      Strains = [NSKeyedUnarchiver unarchiveObjectWithData:dataSave]; 
     } 


     if (favoritesArray == Nil) { 
      favoritesArray = [[NSMutableSet alloc] init]; 
     } 



     if ([[NSUserDefaults standardUserDefaults] objectForKey:@"favorites"] != Nil) { 


      NSData *dataSave = [[NSUserDefaults standardUserDefaults] objectForKey:@"favorites"]; 
      favoritesArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataSave]; 
     } 

I «Просто не уверен, какой код я бы добавил к этому, чтобы кнопка« Проверено »добавила выбранную ячейку из UITableView в FavoritesTableView.

Надеюсь, что это имело смысл. Есть идеи?

+0

Отклонено ли ваше представление в таблице при переходе к представлению деталей, или же просмотр ваших данных будет выталкиваться поверх представления таблицы? Есть ли у списка кафе в вашем столе видный флаг (или что-то подобное)? – JeffRegan

+0

Привет, Джефф! В представлении таблицы отображается представление сведений (я считаю).И да, список кафе в настоящее время имеет любимый флаг (звезда). Я обновил свой код выше, чтобы вы могли видеть, как работает существующая «любимая» функция. Извинения за перегрузку кода lol. –

ответ

0

С точки зрения ремонтопригодности подход, который я обычно беру, может оказаться не лучшим. Однако, с точки зрения реализации, это очень легко. Я передаю ссылку на мой объект (в вашем случае - объект для представления таблицы, который был выбран) в представление деталей. Из представления сведений я могу обновить этот объект, переключив флаг. Поскольку этот объект является тем же объектом, что и представление таблицы, его обновление также обновит представление таблицы (возможно, вам придется перерисовать ячейку представления таблицы). Наконец, я обновляю базу данных из представления сведений.

Редактировать

Так что в вашем коде, это будет выглядеть следующим образом.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    StrainDetailViewController *detailViewController = [[StrainDetailViewController alloc] initWithNibName:@"StrainDetailViewController" bundle:nil]; if ([searchResults count]) { 

     detailViewController.title = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
     //YOU'RE ALREADY DOING IT :) 
     detailViewController.strainDetail = [searchResults objectAtIndex:indexPath.row]; 

    } else { 

     detailViewController.title = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Title"]; 
     //YOU'RE ALREADY DOING IT :) 
     detailViewController.strainDetail = [Strains objectAtIndex:indexPath.row]; 
     NSLog(@"%@", Strains); 
    } 

    [self.navigationController pushViewController:detailViewController animated:YES]; 
} 

Вы уже посылаете ссылку на просмотр деталей! Это облегчает задачу. В вашем представлении подробностей, когда кто-то из избранных настроен, установите флаг любимой для объекта tensDetail. Это также обновит объект matrixDetail в представлении таблицы. Он работает так, потому что вы передаете ссылку (также называемую указателем) на подробное представление. Другими словами, оба ваших объекта tensDetail не являются объектами, а указателями на адрес памяти. Если вы обновляете tarDetail, то адрес памяти для файла splitDetail будет изменен. Не является указателем деформации. Вот ссылка для дальнейшего объяснения https://softwareengineering.stackexchange.com/questions/17898/whats-a-nice-explanation-for-pointers

Так что ваши детали просмотра обработчик будет выглядеть как этот

- (IBAction)buttonpressed:(UIButton *)fave { 
    if (!checked) { 
     [checkedButton setImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal]; 
     checked = YES; 

    } 

    else if (checked) { 
     [checkedButton setImage:[UIImage imageNamed:@"unchecked.png"] forState:UIControlStateNormal]; 
     checked = NO; 
    } 

    //updates in both the detail view and the table view 
    BOOL isItChecked = [[self.strainDetail objectForKey:@"checked"] boolValue]; 
    [self.strainDetail setObject:[NSNumber numberWithBool:checked] forKey:@"checked"]; 
} 

Я также предлагаю создать класс Strain для хранения всех ваших данных деформации. Работа со словарями не является забавой, является склонной к ошибкам и требует навсегда выяснить, какие ключи вам нужны.

+0

Хорошо, простите мое невежество (я все еще изучаю/улавливаю жаргон, lol), но как бы это выглядело в моем коде? Help :) –

+0

Можете ли вы оставить код, в котором вы меняете мнение? – JeffRegan

+0

Я обновил свой пост. Кроме того, я не думаю, что вам нужно заменить весь объект и массив, когда что-то изменится в вашем представлении таблицы. Вы должны иметь возможность изменять объект и не нуждаться во всех других материалах. – JeffRegan

0

Вы можете сохранить «любимое» состояние в глобальной переменной/singleton и получить его при необходимости.

Таким образом, даже если ваш вид таблицы освобожден, вы не потеряете состояние своих ячеек.

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