假設你有下列情節串連圖板方案:在導航控制器中實現滑出菜單時,在哪裏以及如何設置協議委託?
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),這會更復雜。
你應該在哪裏以及如何初始化協議委託?
更新了我的答案以反映導航控制器的使用。 – Andy
謝謝@安迪。您的解決方案非常優雅。非常專業。 – renaissance17