在导航控制器中实现滑出菜单时,在哪里以及如何设置协议委托?
Where and how to set protocol delegate when slide out menu implemented in navigation controller?
假设您有以下故事板方案:
Slide out menu UITableView and feed UITableView embedded in Nav controllers
您想根据在滑出菜单中点击的单元格内容过滤掉您的供稿。
正如您在我上面分享的情节提要方案中看到的那样,您希望仅使用一个标识符为以下的 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
并且您在您的提要视图控制器中实施协议方法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)。
你应该在哪里以及如何初始化你的协议委托?
由于您使用 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];
}
当我看到你的故事板时,你使用 SWRevealViewController 将滑块添加到你的主包中。您添加了一个表格视图来显示菜单列表。所以使用 "tableviewdidSelect" 方法将您的视图控制器添加到 SwWRevealMain 视图,该视图将您的主视图添加到主屏幕上。
假设您有以下故事板方案:
Slide out menu UITableView and feed UITableView embedded in Nav controllers
您想根据在滑出菜单中点击的单元格内容过滤掉您的供稿。
正如您在我上面分享的情节提要方案中看到的那样,您希望仅使用一个标识符为以下的 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
并且您在您的提要视图控制器中实施协议方法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)。
你应该在哪里以及如何初始化你的协议委托?
由于您使用 SWRevealViewController
添加其他控制器作为子控制器,您可以使用 parentViewController
.
- (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];
}
当我看到你的故事板时,你使用 SWRevealViewController 将滑块添加到你的主包中。您添加了一个表格视图来显示菜单列表。所以使用 "tableviewdidSelect" 方法将您的视图控制器添加到 SwWRevealMain 视图,该视图将您的主视图添加到主屏幕上。