UISplitViewController检测后退按钮按下

5

我有一个UISplitViewController,我想在iPad上始终显示主视图和详细视图控制器。这行代码可以为我解决这个问题:

// Always display master and detail in large screens
self.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible

在 prepareForSegue 中,当打开详细视图控制器时,我有以下用于返回按钮的代码行。
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true

现在当用户按下“返回”按钮时,我希望在主视图控制器隐藏后执行某个操作。但是我找不到如何实现这一点。在SplitViewControllerDelegate中,我尝试使用:

func splitViewController(svc: UISplitViewController, willChangeToDisplayMode displayMode: UISplitViewControllerDisplayMode)

但是,这个函数在详细视图控制器变成全屏之前被调用。我是否可以执行某个函数或其他操作来帮助通知我当UISplitViewController完成隐藏主视图时的情况?


把它放在主视图控制器的viewDidDisappear里怎么样? - aganders3
我在viewDidDisappear、viewWillDisappear和viewWillAppear中放置了println语句,但当我显示和隐藏主视图控制器时它们并没有被调用。 - Mike Walker
@MikeWalker 你有什么好运吗? - Steve
@Steve,很不幸我还没有找到解决方法。 - Mike Walker
你找到任何解决方案了吗? - H S W
3个回答

0

您可以在DetailViewController中的视图上添加观察者,并在其触发时执行特定操作:

- (void)viewDidLoad {
  [super viewDidLoad];

  [self addObserver:self forKeyPath:@"view.frame" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionInitial context:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  if ([self observationInfo]) {
    @try {
      [self removeObserver:self forKeyPath:@"view.frame"];
    }
    @catch (NSException *exception) {}

  }
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
  if (object == self && [keyPath isEqualToString:@"view.frame"]) {
    // do your action here
  }
}

0
你可以尝试使用 delegate 方法。
- (UISplitViewControllerDisplayMode)targetDisplayModeForActionInSplitViewController:(UISplitViewController *)svc;

0
我从这里得到了答案。你需要将其放入MasterController(左侧的控制器)。
顺便说一下,这使扩展按钮无效,为了使其扩展/收缩,我将额外的代码放在doSomethingWhenExpandButtonTapped()中。
navigationController?.topViewController?.navigationItem.leftBarButtonItem?.action = #selector(doSomethingWhenExpandButtonTapped)
navigationController?.topViewController?.navigationItem.leftBarButtonItem?.target = self

@objc func doSomethingWhenExpandButtonTapped() {
    print("splitViewController's expand and back button pressed")

    if splitViewController?.preferredDisplayMode == .allVisible {
        splitViewController?.preferredDisplayMode = .primaryHidden
    } else {
        splitViewController?.preferredDisplayMode = .allVisible
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接