2013-05-13 61 views
3

我想实现JViewEditorPanel,其中CenterViewController滑动并显示包含TableView的LeftViewControler。一旦用户在TableView中选择了一行,我希望CenterView通过向后滑动恢复其位置,并且还有一个方法(在CenterViewController中)通过LEftViewController中的参数调用以更新CenterView。有人可以帮助我吗?ViewController与JASidePanels之间发送数据

谢谢。

+0

Jasidepanel是一个很好的控件,但还有其他控件更容易为您实现。尝试在我的答案中的一个,它不会让你感到困惑。 – 2013-05-13 23:36:02

回答

4

有两个部分解决问题的方法:

  1. 第一表示中心面板时用户选择一行:

[self.viewController showCenterPanelAnimated:YES]; //此方法添加到您的tableView行

  1. 传递消息回中央面板与新的指令,这可以通过创建委托或通知来完成。保持它的简单,我将使用通知:在你的左侧面板类

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

: 添加观察员在viewDidLoad中和另一种方法时传回消息:

- (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); 
} 
+0

非常感谢。绝对是最简单的方法。非常感激。 – pbeaumier 2013-05-16 20:15:59

+0

工作正常,但为什么它被称为两次? NSLog打印两次 – CGR 2016-12-02 18:12:51

+0

@CGR我从来没有在iOS 7-9上尝试过这个问题。我只能假设代码库中存在一个错误 – 2016-12-03 14:00:52

0

你看到JASidePanels这些方法

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

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

​​
+0

toggleLeftPanel隐藏表格,它使得视图平滑,但是如表格隐藏,通知能够在屏幕上闪烁。但是当您滑动中央面板时,桌子已经在那里,那么为什么它隐藏了桌子。 – 2013-08-21 13:38:08

+0

它不一定隐藏表格视图,它隐藏在JASidePanel初始化中设置的leftPanelController。视图控制器已经坐在那里,中央面板刚刚离开原来的合作伙伴。 – satheeshwaran 2013-08-21 13:50:46

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; 
} 

我不得不承认,在这里感谢凯文·麦克尼什以指出如何正确获取RootViewController和LeftViewController的实例,以便让委托模式与JASidePanels一起工作。

+0

谢谢!我想知道是否可以包含“UIViewController + JASidePanel.h”,并使用它来代替查找根控制器和左侧面板?我正在尝试它,并且左侧面板保持为零。 – SunnyD 2014-03-20 04:58:48

相关问题