Какой хороший способ для класса (который управляет списком) распространять уведомления? - PullRequest
0 голосов
/ 29 сентября 2011

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

Я пишу класс «Избранное», который будет управлять списком любимых страниц пользователя.Когда пользователь нажимает кнопку «Избранное», он вызывает метод addFavorite: или removeFavorite: класса Favorites.Ввод кажется достаточно простым.

Мой вопрос: каков наилучший способ распространения этого события изменения состояния во всех моих представлениях?У меня есть много избыточных «любимых» индикаторов, разбросанных по всему приложению, и все они должны быть синхронизированы.Например, если пользователь выбирает Pink Floyd в одном представлении (изменяя звезду с серого на желтый), все остальные представления, которые ссылаются на Pink Floyd, должны отображать желтые звезды рядом со ссылкой вместо серых.

Насколько я понимаю, есть много способов сделать это с помощью уведомлений Objective-C.Я просто ищу чистый и ремонтопригодный.Что сработало для вас в прошлом?Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Проверьте на NSNotificationCenter и NSNotification.Я использую уведомления довольно регулярно, особенно если более чем одна сторона заинтересована в том, чтобы делиться информацией делало схему делегатов сложной.Основная проблема с уведомлениями, с которыми я столкнулся, заключается в том, чтобы подписать UITableViewCell на уведомление: избегая того, чтобы удаленные ячейки отвечали на уведомление.

0 голосов
/ 07 октября 2011

Вот код, который я в итоге написал, используя NSNotificationCenter и UITableView для получения бонусных баллов.Может быть, это поможет кому-то еще.

В классе Избранное:

+ (void)toggleFavorite:(NSString *)artistName {
    if([favorites member:artistName]) {
        [favorites removeObject:artistName];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"favoriteRemoved"
                                                            object:artistName];
    } else {
        [favorites addObject:artistName];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"favoriteAdded"
                                                            object:artistName];
    }

    [[UserLibrary current] verifyLibrary];
}

Одно из 3 представлений, которое взаимодействует с избранным: представление таблицы, где каждая ячейка имеет звездочку:

// register for notifications
- (void)awakeFromNib {
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(favoriteAdded:)
                                                 name:@"favoriteAdded"
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(favoriteRemoved:)
                                                 name:@"favoriteRemoved"
                                               object:nil];
}

// search through visible cells for the one that needs to be starred
- (void)favoriteAdded:(NSNotification *)notification {
    NSString *artistName = notification.object;
    for(ArtistTableViewCell *cell in [(UITableView*)self.view visibleCells]) {
        if([artistName isEqualToString:cell.artistLabel.text]) {
            cell.starred = YES;
        }
    }
}

// search through visible cells for the one that needs to be de-starred
- (void)favoriteRemoved:(NSNotification *)notification {
    NSString *artistName = notification.object;
    for(ArtistTableViewCell *cell in [(UITableView*)self.view visibleCells]) {
        if([artistName isEqualToString:cell.artistLabel.text]) {
            cell.starred = NO;
        }
    }
}

// when cells are created or reused, make sure the star is set properly
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ArtistTableViewCell *cell = ...
    NSString *name = ...

    cell.starred = [Favorites isFavorite:name];
    return cell;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    [super dealloc];
}

Ячейка таблицы.Обратите внимание, как ячейки получают события из TableView, чтобы им не приходилось регистрироваться для уведомлений (и существует риск получения уведомлений после удаления из очереди).

- (IBAction)starPressed:(id)sender {
    NSString *name = artistLabel.text;
    [Favorites toggleFavorite:name];
}

- (void)setStarred:(bool)isFavorite {
    UIImage *img;
    if(isFavorite) {
        img = [UIImage imageNamed:@"filledstar30px"];
    } else {
        img = [UIImage imageNamed:@"emptystar30px"];
    }
    [favoriteButton setImage:img forState:UIControlStateNormal];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...