我遇到了一个看起来很简单的问题,但我无法弄清楚为什么它不起作用。
我有一个标签栏,其中一个 TableView (时间轴)用于主应用程序,一个用于设置。如果用户单击设置选项卡,他们有机会选择一个主题,该主题只是另一个表格 View 的形式,其中包含许多代表主题的单元格。
如果用户单击主题“黑色”,我希望选项卡栏中的其他 TableView 更改主题。
我不担心主题的实现;我在这里似乎对我的委托(delegate)协议(protocol)有问题,尽管我遵循了我认为与我在我的应用程序中对委托(delegate)协议(protocol)的其他用途所遵循的步骤相同的步骤。
这是我的主题 TableView :
// .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);
}
在我想要传递字符串的主 TableView 中:
// .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 显示我选择了“黑色”单元格,当委托(delegate)发生在时间轴上时,它始终为零。
我正在使用带有自定义静态单元格的分组 TableView (据我所知,ThemesTableView 上不需要 cellForRowAtIndexPath,是吗?
更新:SelectThemesTableViewController
在 Storyboard 中,SelectThemesTableViewController 是从 Settings Table View Controller 选项卡中形成的一个 segue(推送)。所以我在标签栏中有两个标签;第一个是时间轴,第二个是 SettingsTableViewController。这嵌入在导航 Controller 中。 TableView 中的第一个单元格称为“主题”,单击该单元格后,将向 SelectThemesTableViewController 发送一个 segue(推送)。我没有在任何地方准备 ForSegue,但这让我觉得也许我应该这样做?
我错过了什么?非常感谢任何帮助!
最佳答案
由于您在选项卡栏中同时使用两个 Controller ,因此没有任何选项可以相互设置委托(delegate)。相反,您可以做的只是在 didSelectRow 委托(delegate)方法内的 SelectThemesTableViewController 中使用选定的主题名称更新 NSUserDefaults,当用户再次点击第一个选项卡时,只需检查 TimelineTableViewController 的 viewWillAppear 方法中的 NSUserDefault 值并根据值更新 UI。
// .h
@interface SelectThemesTableViewController : UITableViewController
@property (nonatomic, strong) NSString *selectedTheme;
@end
// .m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
self.selectedTheme = selectedCell.textLabel.text;
[[NSUserDefaults standardUserDefaults] setObject:self.selectedTheme forKey:@"Theme"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"The value of the selected cell is %@", self.selectedTheme);
}
------------------------------------------------------------------------------------
// .h
@property (nonatomic, strong) NSString *selectedTheme;
// .m
@interface TimelineTableViewController () <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, NSFetchedResultsControllerDelegate>
@end
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.selectedTheme = [[NSUserDefaults standardUserDefaults] objectForKey:@"Theme"];
NSLog(@"What is this value %@", self.selectedTheme);
if ([self.selectedTheme isEqualToString:@"Black"])
{
NSLog(@"The value is %@", self.selectedTheme);
}
else
{
NSLog(@"Nope");
}
}
关于ios - 简单的 iOS 委托(delegate)协议(protocol)不适用于在 View Controller 之间传递字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22473473/