2012-06-21 3 views
1

У меня есть UITableView в ViewController с пользовательским UITableClass. В таблице отображаются разные песни, которые пользователь может воспроизвести. Таблица заполнена методом, который извлекает данные с сервера. Этот метод вызывается в ViewDidLoad.Дублирование UITableView с другим источником данных

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

Как это реализовать? Должен ли я создать другой метод, который загружает новые данные в таблицу только с «предпочтительными» треками? Должен инициализировать новый UITableView с тем же классом и каким-то образом установить другой источник данных или новый ViewController? Если да, то как?

Будет небольшая разница между двумя ViewControllers, которые содержат UITableViews. В исходном ViewController со всеми треками будет кнопка, которая либо изменяет источник данных, либо инициализирует новый UITableView (в зависимости от того, как он реализован). «Предпочтительный» ViewController будет иметь кнопку «Назад».

ответ

0

Вы всегда можете идти по пути только обновления центрального списка воспроизведения UITableView, в этом случае вы бы просто поменять данные в вашем dataSource (в данном случае, возможно NSMutableArray *playlist?), А затем вызвать [UITableView reloadData]. В этой схеме вы избегаете накладных расходов, связанных с несколькими видами и проблемой передачи данных.

Если вы планируете создавать дополнительные функции для списка избранных песен, может потребоваться дополнительный, настроенный UIViewController. В этом смысле его можно повторно использовать, если вы решите добавить дополнительные списки песен. Это было бы хорошим решением, если вы намереваетесь позволить им сделать что-нибудь еще, что вы не захотите загромождать свой основной интерфейс с помощью вашего списка (ов), таких как редактирование названия, порядок песен и т. Д.

Если эти два вида быть более или менее идентичным, вы можете просто настроить новый UIViewController, либо передать новые данные через свойство, либо загрузить его в свой init, а затем вставить в стек представления. Пока ваше приложение основано на навигации, кнопка «Назад» появится сама по себе, как только вы нажмете ваш вторичный UIViewController в стек. Это не функциональность, которую вам нужно добавить самостоятельно. Преимущества этого включают повторное использование кода, что является хорошим навыком для дизайнера интерфейса и инженера.

Если вы просто хотите просмотр только для чтения, вы также можете просмотреть UIPopoverController с данными, которые будут уволены после их нажатия. Это решение не является надежным и не должно использоваться, если вы намереваетесь, чтобы пользователь делал что-то большее, чем нажатие на запись, или если вы ожидаете, что ваши наборы данных станут большими.

При планировании пользовательского интерфейса и потока, просто убедитесь, что вы думаете о том, какие направления вы можете предпринять в будущем. Как уже упоминалось в другом ответе, как вы храните свои данные, имеет значение, а также то, как вы намерены совершать звонки на ваш сервер (нажатие кнопок? Через заданное время?)

0

Как вы храните данные с сервера? если вы используете CoreData (или MagicalRecord, которые я могу рекомендовать), что с контроллером надуманных результатов с другим аргументом будет единственным изменением вам нужно .....

Ах, ссылка на MagicalRecord: MagicalRecord

0

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

0

У меня был бы метод обновления и который переключается между «показать все» и «показать избранные».

В принципе, если кнопка нажата, переключитесь на противоположную группу объектов и соответствующим образом обновите текст на кнопке. В моем примере таблица всегда будет загружать массив, называемый «tableDataArray», и вы получите количество строк и т. Д. От его длины.

Как ...

-(IBAction)refresh { 

if ([faveButton.text isEqualToString:@"Show All"]){ 

    tableDataArray = favoriteArray; 
    [faveButton setText:@"Show Favorites"]; 
    } 
else { 
    tableDataArray = allSongsArray; 
    [faveButton setText:@"Show All"]; 
    } 

[tableView reloadData]; 

} 
+1

НИКОГДА не используйте метки для элементов управления пользовательского интерфейса для управления потоком выполнения. И не сравнивайте строки с '=='. –

+0

Я мог бы предложить ему сохранить bool вместо этого, но нет ничего плохого в этом подходе. Данные уже есть, поэтому воспользуйтесь этим! Однако я удалил '==' и заменил его на 'isEqualToString:' –

+0

Это просто плохо. Теперь представьте, что вам нужно локализовать ваше приложение (поддержка нескольких языков). Что вы (или человек после вас) сделаете? Сколько времени вы потратите на это? Сколько ошибок вы поймаете или (хуже) пропустите? –

1

Я хотел бы создать сегментированный элемент управления, который имеет варианты «Избранное | Все» и при включении BOOLfavoritesOnly называется или что-то подобное переключается с YES на NO или наоборот. Мои песни будут храниться в NSArray в NSDictionary называеться songsArray и я хотел бы использовать это в качестве моих DataSource методов:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if(favoritesOnly) 
    { 
     NSInteger count = 0; 
     for(int n=0; n<[songsArray count]; n++) 
      if([[[songsArray objectAtIndex:n] objectForKey:@"Favorite"] isEqualToString:@"YES"]) 
       count++; 
     return count; 
    } 
    else 
    { 
     return [songsArray count]; 
    } 
} 

и затем для клеток:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
{ 
    UITableViewCell *theCell = [tableView dequeueReusableCellWithIdentifier:@"Proto Cell"]; 
    if(favoritesOnly) 
    { 
     NSInteger count = -1; 
     for(int n=0; n<[songsArray count]; n++) 
     { 
      if([[[songsArray objectAtIndex:n] objectForKey:@"Favorite"] isEqualToString:@"YES"]) 
      { 
       count++; 
       if(count==[indexPath row]) 
       { 
        //Configure the Cell using [songsArray objectAtIndex:n] 
        return theCell; 
       } 
      } 
     } 
     //If you got here there was an error; Error cell? 
     return theCell; 
    } 
    else 
    { 
     //Configure cell using [songsArray objectAtIndex:[indexPath row]] 
     return theCell; 
    } 
} 

Таким образом, вы используете тот же набора данных и того же UITableView, вы просто используете свой контроль, чтобы правильно делегировать, как DataSource отображает информацию о UITableView

Теперь, если вы используя CoreData и NSFetchedResultsController, все это намного проще.

0

Простейший способ сделать это - иметь два экземпляра одного и того же контроллера. Каждый экземпляр будет иметь свой собственный источник данных, один со всеми песнями, другой с только избранными.

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