在导航控制器中实现滑出菜单时在哪里以及如何设置协议委托?

Posted

技术标签:

【中文标题】在导航控制器中实现滑出菜单时在哪里以及如何设置协议委托?【英文标题】:Where and how to set protocol delegate when slide out menu implemented in navigation controller? 【发布时间】:2015-10-15 02:24:42 【问题描述】:

假设您有以下情节提要方案:

Slide out menu UITableView and feed UITableView embedded in Nav controllers

您希望根据在滑出菜单中点击的单元格的内容过滤掉您的提要。

正如您在我上面分享的故事板方案中看到的那样,您希望只使用一个标识符为:

@"Filter_MenuItem"

您在滑出式菜单视图控制器中声明了以下协议:

//  SlideOutMenuTableViewController.h

#import <UIKit/UIKit.h>
#import "SlideOutMenuItems.h"
#import "SlideOutMenuCellTableViewCell.h"

@protocol filterFeed <NSObject>

-(void)filterFeedFromSlideOutItemTapped:(NSString *)slideOutItemStringData; //String to pass slideOut menu item string back to feed
@end


@interface SlideOutMenuTableViewController : UITableViewController

@property(nonatomic,assign)id<filterFeed> stringDelegate;

@end

然后你在你的提要视图控制器中实现协议方法filterFeedFromSlideOutItemTapped:

#pragma mark - Filter feed based on slideout menu item tapped

-(void)filterFeedFromSlideOutItemTapped:(NSString *)slideOutItemStringData

    NSLog(@"filterFeedFromSlideOutItemTapped just started");
    if (!(slideOutItemStringData == (nil)))
        //Pass self.feed.flames + filtering string ==> filtered flames
            NSMutableArray* allFlames = [[NSMutableArray alloc] initWithArray:self.feed.flames];
            NSString *flameRelationFilter = slideOutItemStringData;
            NSPredicate* sortFlames = [NSPredicate predicateWithFormat:@"(kFlameRelation like %@)", flameRelationFilter];
            NSArray* filteredFlames = [allFlames filteredArrayUsingPredicate:sortFlames];
            NSLog(@"The filter flames are %@", filteredFlames);
            NSMutableArray *mutableFilteredFlames = [filteredFlames mutableCopy];
            self.filteredFeed.flames = mutableFilteredFlames;

            [self.tableView reloadData];

        

您确保在滑出式菜单视图控制器的实现中合成您的委托:@synthesize stringDelegate;

在您在滑出式菜单视图控制器的实现中调用您的协议方法之前:

[stringDelegate filterFeedFromSlideOutItemTapped:[self.slideOutMenuItems menuItemAtIndex:indexPath.row]];

您知道,首先,您需要初始化您的协议委托:

instanceOfSlideOutMenuTableViewController.stringDelegate=self;

通常,您可以在“prepareForSegue”方法中成功完成此操作。但这次更复杂,因为您实现了滑出菜单(实际上您并没有重新发明***,而是选择了您的实现 here)。

您应该在哪里以及如何初始化您的协议委托?

【问题讨论】:

【参考方案1】:

由于您使用 SWRevealViewController 将其他控制器添加为子控制器,因此您可以使用 parentViewController 从菜单中直接访问 feed 控制器。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

  // get reveal controller
  SWRevealViewController *revealController = (SWRevealViewController *)self.navigationController.parentViewController;

  // get content controller
  UINavigationController *feedNavController = (UINavigationController *)revealController.frontViewController;

  // rename "FeedController" to whatever class you use for front controller
  FeedController *feedController = (FeedController *)feedNavController.topViewController;

  // get menu item
  NSString *menuItem = [self.slideOutMenuItems menuItemAtIndex:indexPath.row];

  // pass selected item to feed controller
  [feedController filterFeedFromSlideOutItemTapped:menuItem];

【讨论】:

更新了我的答案以反映导航控制器的使用。 谢谢@Andy。您的解决方案非常优雅。出色的专业知识。【参考方案2】:

正如我看到的故事板,您使用 SWRevealViewController 在主包中添加滑块。您添加了一个 tableview 来显示 menu 列表。所以使用“tableviewdidSelect”方法将您的视图控制器添加到在主屏幕上添加主视图的 SwWRevealMain 视图。

【讨论】:

以上是关于在导航控制器中实现滑出菜单时在哪里以及如何设置协议委托?的主要内容,如果未能解决你的问题,请参考以下文章

如何防止用户从滑出设置菜单中连续两次调用同一个视图控制器?

如何根据滑出菜单导航到不同的视图控制器

如何在batmanjs中实现导航菜单

通过点击带有协议的滑出菜单过滤 UITableView 提要

滑出式菜单不显示网页第 2 部分中的导航链接

快速滑出菜单而不滑动导航栏(以编程方式)