2015-10-15 40 views
1

假設你有下列情節串連圖板方案:在導航控制器中實現滑出菜單時,在哪裏以及如何設置協議委託?

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),這會更復雜。

你應該在哪裏以及如何初始化協議委託?

回答

0

由於您使用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]; 
} 
+0

更新了我的答案以反映導航控制器的使用。 – Andy

+1

謝謝@安迪。您的解決方案非常優雅。非常專業。 – renaissance17

0

正如我看到你的故事板你使用SWRevealViewController在你的主包中添加滑塊。你添加了一個tableview來顯示菜單列表。所以使用「tableviewdidSelect」方法將視圖控制器添加到SwWRevealMain視圖,該視圖在主屏幕上添加了主視圖。