3

CenterViewController がスライドして、TableView を含む LeftViewControler を明らかにする JASidePanels を実装しようとしています。ユーザーが TableView で行を選択したら、CenterView をスライドして元の位置に戻し、(CenterViewController 内の) メソッドを LEftViewController からのパラメータで呼び出して CenterView を更新するようにします。誰かがこれで私を助けてくれますか?

ありがとうございました。

4

3 に答える 3

4

問題を解決するには、次の 2 つの部分があります。

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

JASidePanels でデリゲート パターンを機能させるために、RootViewController と LeftViewController のインスタンスを適切に取得する方法を指摘してくれた Kevin McNeish 氏に感謝します。

于 2013-05-21T03:25:41.327 に答える
0

JASidePanels でこれらのメソッドを見ましたか

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

JASidePanels は適切な実装です。左、中央、右のビュー コントローラーを設定できます。したがって、左側の VC として UITableViewController があり、行の選択に従って中央の 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 に答える