在ViewController和JASidePanels之间发送数据

时间:2013-05-13 23:19:08

标签: ios

我正在尝试实现JASidePanels,其中CenterViewController滑动并显示包含TableView的LeftViewControler。一旦用户在TableView中选择了一行,我希望CenterView通过向后滑动重新获得它的位置,并且还可以使用LEftViewController中的参数调用方法(在CenterViewController中)来更新CenterView。有人可以帮助我吗?

谢谢。

3 个答案:

答案 0 :(得分:4)

解决问题有两个部分:

  1. 用户选择行时首先显示中心面板:
  2. [self.viewController showCenterPanelAnimated:YES]; //将此方法添加到tableView行

    1. 使用新指令将消息传递回中心面板,这可以通过创建委托或通知来完成。为了保持简单,我将使用通知:
    2. 左侧小组课程中的

       // Add to your tableView row method
          NSNotification *msg = [NSNotification notificationWithName:@"leftPanelMsg" object:@"Hello"];
          [[NSNotificationCenter defaultCenter] postNotification:msg];
      

      在您的中心小组课程中: 在viewDidLoad中添加Observer,并在传递消息时添加另一个方法:

      - (void)viewDidLoad {
          [super viewDidLoad];
      
          // method listen to meesssage with specfic name and calls selector when it get hit
          [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(msgResponder:) name:@"leftPanelMsg" object:nil];
          }
      
      -(void)msgResponder:(NSNotification *)notification {
          NSLog(@"name:%@ object:%@", notification.name, notification.object);
      }
      

答案 1 :(得分:2)

如果要使用委托,则必须在LeftViewController.h文件中添加协议,例如

@protocol LeftViewControllerDelegate <NSObject>

-(void)useThisValue:(NSString *)value;

@end

@interface LeftViewController : UITableViewController

@property (weak, nonatomic) id <LeftViewControllerDelegate> delegate;

@end

在tableView:didSelectRowAtIndexPath:方法中,您可以添加

[self.delegate useThisValue:menu[indexPath.row]];

您的CenterViewController将成为LeftViewController的委托,因此在您的CenterViewController.h文件中,导入LeftViewController.h并添加:

@interface CenterViewController : UIViewController <LeftViewControllerDelegate>

- (void)useThisValue:(NSString *)value;

在CenterViewController.m文件中,导入AppDelegate.h和RootViewController.h文件。在它的viewDidLoad方法中,您必须获得对JASidePanelController子类(RootViewController)和leftViewController的当前实例的引用:

RootViewController *rootViewController = (RootViewController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController];

LeftViewController *leftViewController = (LeftViewController *)rootViewController.leftPanel;

然后使CenterViewController成为LeftViewController的委托:

leftViewController.delegate = self;

[super viewDidLoad];

实现您希望的委托方法,例如:

- (void) useThisValue:(NSString *)value
{
     self.label.text = value;
}

我必须承认并感谢Kevin McNeish在这里向我指出如何正确获取RootViewController和LeftViewController的实例,以便让委托模式与JASidePanels一起使用。

答案 2 :(得分:0)

您是否在JASidePanels中看到了这些方法

// toggle them opened/closed
- (void)toggleLeftPanel:(id)sender;
- (void)toggleRightPanel:(id)sender;

JASidePanels是一个很好的实现,你可以设置左,中,右视图控制器。因此,假设您有一个UITableViewController作为左VC,并根据行选择加载中心VC。你的左VC应该有#import“UIViewController + JASidePanel.h”。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  switch (indexPath.row)

case 1:
{
    self.sidePanelController.centerPanel = [[UINavigationController alloc] initWithRootViewController:[[FirstViewController alloc] init]];
[self.sidePanelController toggleLeftPanel:nil];
break;
}

case 2:
{
self.sidePanelController.centerPanel = [[UINavigationController alloc] initWithRootViewController:[[SecondViewController alloc] init]];
[self.sidePanelController toggleLeftPanel:nil];
break;
}

}