У меня есть то, что кажется простой проблемой, и я просто не могу понять, почему она не работает.
У меня есть панель вкладок с одним табличным представлением (временная шкала) для основного приложения и одним для настроек. Если пользователь нажимает на вкладку настроек, у него есть возможность выбрать тему, которая представлена в виде другого табличного представления с несколькими ячейками, представляющими темы.
Если пользователь нажимает на тему «Черный», я хочу, чтобы другое табличное представление на панели вкладок изменило тему.
Я не беспокоюсь о реализации темы; Кажется, у меня возникли проблемы с моим протоколом делегирования здесь, хотя я выполнил то, что я считаю теми же шагами, что и для других применений протоколов делегирования в моем приложении.
Вот мой вид таблицы для тем:
// .h
@class SelectThemesTableViewController;
@protocol SelectThemesTableViewControllerDelegate <NSObject>
- (void)selectThemesTableViewController:(SelectThemesTableViewController *)controller didSelectCell:(NSString *)selectedTheme;
@end
@interface SelectThemesTableViewController : UITableViewController
@property (nonatomic, weak) id <SelectThemesTableViewControllerDelegate> delegate;
@property (nonatomic, strong) NSString *selectedTheme;
// .m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
self.selectedTheme = selectedCell.textLabel.text;
[self.delegate selectThemesTableViewController:self didSelectCell:self.selectedTheme];
NSLog(@"The value of the selected cell is %@", self.selectedTheme);
}
В представлении основной таблицы, где я хочу передать строку:
// .h
@property (nonatomic, strong) NSString *selectedTheme;
// .m
@interface TimelineTableViewController () <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, NSFetchedResultsControllerDelegate, SelectThemesTableViewControllerDelegate>
@end
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
SelectThemesTableViewController *selectThemesTableViewController = [[SelectThemesTableViewController alloc] init];
selectThemesTableViewController.delegate = self;
NSLog(@"What is this value %@", self.selectedTheme);
if ([self.selectedTheme isEqualToString:@"Black"])
{
NSLog(@"The value is %@", self.selectedTheme);
}
else
{
NSLog(@"Nope");
}
}
// Here in the viewWillAppear, I'm clearly setting the delegate but the self.selectedTheme is always nil.
// Delegate method in the Timeline Table view:
- (void)selectThemesTableViewController:(SelectThemesTableViewController *)controller didSelectCell:(NSString *)selectedTheme
{
self.selectedTheme = selectedTheme;
NSLog(@"String = %@", self.selectedTheme);
// The selectedTheme is always nil here
}
Я поставил точки останова и проследил за трассировкой, но пока в themeTableView NSLog показывает, что я выбираю «черную» ячейку, когда делегирование происходит на временной шкале, оно всегда равно нулю.
Я использую сгруппированное табличное представление с настраиваемой статической ячейкой (насколько я понимаю, в ThemesTableView нет необходимости в cellForRowAtIndexPath, не так ли?
Обновление: SelectThemesTableViewController
В раскадровке SelectThemesTableViewController формируется как переход (push) с вкладки «Контроллер табличного представления настроек». Итак, у меня есть две вкладки на панели вкладок; первый — это временная шкала, а второй — SettingsTableViewController. Это встроено в навигационный контроллер. Первая ячейка в табличном представлении называется «Темы», и при нажатии на нее происходит переход (нажатие) к SelectThemesTableViewController. Я нигде не готовлюсь к ForSegue, но это наводит меня на мысль, что, возможно, мне следует это сделать?
Что мне не хватает? Любая помощь будет очень признательна!