为什么这个UITableViewController以模态方式解除?

时间:2016-12-17 19:57:49

标签: swift uiviewcontroller segue

我有一个UITableViewController,当从一个屏幕显示时,会显示标准' show' segue从右到左,当从另一个屏幕(UIViewController)呈现时,从底部以模态方式呈现。我从几个月前问过的question得到的帮助中得到了这个正常工作(截图)。

关键是从我的“设置”屏幕的UINavigationController创建segue到共享UITableViewController,而不是从UITableViewCell创建。奇怪的是,即使它从右到左正确显示,解雇它也会以模态方式(从上到下)关闭它。

我让呈现表视图控制器成为它所呈现的UITableViewController的代表,以便它将处理解雇。这是它实现的协议和扩展(Swift 2.3):

protocol DismissalDelegate : class {
    func selectionDidFinish(controller: UIViewController)
}

extension DismissalDelegate where Self: UIViewController {
    func selectionDidFinish(viewController: UIViewController) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}

我将它设置在呈现控制器中定义的segue中:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "goToLifts" {
        let destination = segue.destinationViewController as! LiftSelectionTableViewController
        destination.dismissalDelegate = self
    } else {
        return
    }
}

当用户进行选择时,所呈现的表视图控制器会调用delegate?.selectionDidFinish(self)

didSelectRowAtIndexPath

在呈现表视图控制器中调用此方法:

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        guard (dismissalDelegate != nil ) else {
            return
        }
        dismissalDelegate?.selectionDidFinish(self)
    }

我已经通过APIs查看了视图控制器,并且找不到任何可以控制此选项的选项。 func selectionDidFinish(controller: LiftSelectionTableViewController) { self.dismissViewControllerAnimated(true, completion: nil) } API甚至表示解雇以模态方式呈现的视图控制器,但我没有看到任何与解雇有关的内容。

如何从我的dismiss(animated:completion:)(从右到左,然后回来)呈现它时,以及从呈现时保持模态行为的方式来解除它所呈现的相同方式。另一个视图(UITableViewController)?

1 个答案:

答案 0 :(得分:1)

我在这里有点困惑,看起来你正在使用委托,因为呈现视图控制器应该知道如何呈现LiftSelectionTableViewController

所以在表视图控制器中,你会有

func selectionDidFinish(viewController: UIViewController) {
    self.navigationController?.popViewControllerAnimated(true)
}

在另一个视图控制器中,你应该有

func selectionDidFinish(viewController: UIViewController) {
    self.dismissViewControllerAnimated(true, completion: nil)
}

如果我错了,你不知道视图控制器是如何呈现的,那么我会尝试检查导航控制器上的顶视图控制器是否显示为视图控制器。如果是,则弹出视图控制器,如果不是,则关闭视图控制器。

func selectionDidFinish(viewController: UIViewController) {
    if self.navigationController?.topViewController == viewController {
        self.navigationController?.popViewControllerAnimated(true)
    } else {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}