首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JASidePanels在ViewController之间发送数据

使用JASidePanels在ViewController之间发送数据
EN

Stack Overflow用户
提问于 2013-05-14 07:19:08
回答 3查看 1.9K关注 0票数 3

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

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-14 18:51:29

有两个部分可以解决你的问题:

当用户选择一行时,

  1. 首先显示中心面板:

self.viewController showCenterPanelAnimated:是;//将此方法添加到您的tableView行

  1. 使用新指令将消息传递回中心面板,这可以通过创建委托或通知来完成。为了简单起见,我将使用通知:

在您的左侧面板类中:

代码语言:javascript
复制
 // Add to your tableView row method
    NSNotification *msg = [NSNotification notificationWithName:@"leftPanelMsg" object:@"Hello"];
    [[NSNotificationCenter defaultCenter] postNotification:msg];

在您的中心面板类中:在viewDidLoad中添加观察者,并在消息回传时添加另一个方法:

代码语言:javascript
复制
- (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);
}
票数 4
EN

Stack Overflow用户

发布于 2013-05-21 11:25:41

如果你想使用委托,那么你必须在LeftViewController.h文件中添加一个协议,例如

代码语言:javascript
复制
@protocol LeftViewControllerDelegate <NSObject>

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

@end

@interface LeftViewController : UITableViewController

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

@end

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

代码语言:javascript
复制
[self.delegate useThisValue:menu[indexPath.row]];

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

代码语言:javascript
复制
@interface CenterViewController : UIViewController <LeftViewControllerDelegate>

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

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

代码语言:javascript
复制
RootViewController *rootViewController = (RootViewController *)[[[[UIApplication sharedApplication] delegate] window] rootViewController];

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

然后让CenterViewController作为LeftViewController的代理:

代码语言:javascript
复制
leftViewController.delegate = self;

[super viewDidLoad];

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

代码语言:javascript
复制
- (void) useThisValue:(NSString *)value
{
     self.label.text = value;
}

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

票数 2
EN

Stack Overflow用户

发布于 2013-05-14 12:21:49

您在JASidePanels中看到这些方法了吗

代码语言:javascript
复制
// toggle them opened/closed
- (void)toggleLeftPanel:(id)sender;
- (void)toggleRightPanel:(id)sender;

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

代码语言:javascript
复制
- (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;
}

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16532705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档