0

選択したメニュー項目と表示された topViewController をプログラムで変更しようとしています。つまり、UITabBarController で選択したタブを変更するのと同じことをしようとしています。

[self.tabBarController setSelectedIndex:2];

したがって、別の SO の質問 ( https://stackoverflow.com/a/20309377/1161723 ) によると、これを使用して表示される topViewController を変更しています。

[self.slidingViewController anchorTopViewToRightAnimated:NO];
self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
[self.slidingViewController resetTopViewAnimated:NO];

しかし、うまくいきません。最初の 2 行は正しく機能し、それぞれメニューを表示して topViewController を変更しますが、最後の行はサイドメニューを非表示にしないため、ジェスチャーまたはボタンをタップして非表示にするまでそこにとどまります。デバッグは、ECSlidingViewController のインスタンスの代わりに最後のself.slidingViewControllerリターンを示します。nilそして、最初と最後の行をスキップして、次の行だけを残すと:

self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];

アプリがクラッシュします。

サイドメニューを非表示にして、ビューを適切に変更する方法はありますか? ECSlidingViewController 2.0.1 を使用しています

編集:競合ブロックを使用したり、スライディングビューコントローラーへの参照を作成したりしても、違いはありません:

ECSlidingViewController *slidingViewController = self.slidingViewController;
[slidingViewController anchorTopViewToRightAnimated:NO onComplete:^{
    slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
   [slidingViewController resetTopViewAnimated:NO];
}];

更新 14.7.2014:

カスタム ビュー コントローラ トランジションが使用されている場合にのみ、サイドメニューが非表示になりません。たとえば、TransitionFun の例では。

アンワインド セグエ ハンドラに次のものだけを残すと、アプリがクラッシュします。

- (IBAction)unwindModalView:(UIStoryboardSegue *)sender
{
    ECSlidingViewController *slidingViewController = [self slidingViewController];
    slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"METransitionsNavigationController"];
}

注:最後のビュー コントローラー (アンワインド セグエの呼び出し元) がモーダルセグエではなくプッシュセグエによって提示された場合、アプリはクラッシュしません。

ここの画像でView Controllerの階層を確認できます

(これは基本的に、NavigationVC にカプセル化され、設定のセルからのセグエによってモーダルに提示されるもう 1 つの VC を持つ TransitionFun の例です)

4

3 に答える 3

2

self.slidingViewControllerは計算変数です。計算は、View Controller 階層をナビゲートすることによって行われます。したがって、View Controller が変更の一部として階層から削除されると、self.slidingViewController機能しなくなります。

また、呼び出し続けるのは非常に非効率的です。への変更:

ECSlidingViewController *slidingController = self.slidingViewController;

[slidingController anchorTopViewToRightAnimated:NO];
slidingController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MESettingsNavigationController"];
[slidingController resetTopViewAnimated:NO];
于 2014-03-11T23:53:21.077 に答える
0

誰かが答えを見つけられなかった場合に備えて、私はこのようにしました。

1- #import "UIViewController+ECSlidingViewController.h" を menuViewController に 2- destinationViewController の stroboardID を "someID" に設定 3- アクションをトリガーするとき、バックエンドで次のコードを使用:

if(self.slidingViewController.currentTopViewPosition == ECSlidingViewControllerTopViewPositionCentered){
    [self.slidingViewController anchorTopViewToRightAnimated:YES];
}
else{
    self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"someID"];
    [self.slidingViewController resetTopViewAnimated:YES];
于 2015-05-21T10:45:08.137 に答える
0

さらに調査した結果、最上位のビュー コントローラーの ( MyViewController) presentingViewController プロパティが のECSlidingViewController代わりに のインスタンスを返すことMESettingsViewControllerがわかりMESettingsViewControllerましたMyViewController

実際ECSlidingViewControllerはモーダル ビューを表示しているため、アンワインド ハンドラーはモーダル ビューを画面に残したために機能していませんでした。

解決:

アンワインド セグエは忘れて、モーダルに表示されるトップ ビュー コントローラー ( MyViewController) で次のコードを使用して、ECSlidingViewController の topViewController プロパティを変更します。

- (IBAction)switchToTransitionsScreen:(id)sender
{
    self.slidingViewController.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"METransitionsNavigationController"];
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

}

または、デリゲート パターンを使用してMESettingsViewController、たとえば に配置します。

于 2014-03-15T16:13:07.867 に答える