3

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

谢谢你。

4

3 回答 3

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 中添加 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);
}
于 2013-05-14T10:51:29.030 回答
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 一起使用。

于 2013-05-21T03:25:41.327 回答
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;
}

}
于 2013-05-14T04:21:49.000 回答