ios - 简单的 iOS 委托(delegate)协议(protocol)不适用于在 View Controller 之间传递字符串

标签 ios iphone uitableview protocols delegation

我遇到了一个看起来很简单的问题,但我无法弄清楚为什么它不起作用。

我有一个标签栏,其中一个 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/

相关文章:

ios - TableView Cell 找不到成员 NSNumber 变量

iphone - 将 NSURL 与在其获取请求中使用方括号的 PHP Web 服务一起使用

ios - 根据方向更改 UITableViewCell 的内容

iOS(结构): Crashlytics crashing app on launch

ios - 以编程方式将系统图像添加到导航栏

iphone - iPad 应用程序的奇怪崩溃报告

iphone - TabBar ViewControllers 按顺序显示第一个第二个项目

ios - 找不到合适的方法来覆盖 RowsInSection xamarin

ios - 使用自定义对象初始化自定义 UITableViewCell

ios - 根据 coredata 中的属性名称获取唯一对象