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

时间:2015-10-15 02:24:42

标签: ios objective-c uitableview delegates protocols

想象一下,您有以下故事板方案:

Slide out menu UITableView and feed UITableView embedded in Nav controllers

您希望根据幻灯片菜单中点按的单元格内容过滤掉您的Feed。

正如您在上面分享的故事板方案中所看到的,您希望仅使用一个标识符为的segue动态执行此操作:

@"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

您在Feed视图控制器中实施协议方法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;

通常,您可以在&#34; prepareForSegue&#34;方法。但是这次因为你实现了一个滑出菜单(你实际上没有重新发明轮子,你选择了你的实现here),它会变得更复杂。

您应该在何处以及如何初始化协议代理?

2 个答案:

答案 0 :(得分:0)

由于您使用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];
}

答案 1 :(得分:0)

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