gpt4 book ai didi

ios - 从不活动的 Viewcontroller 推送到新的 Viewcontroller(以编程方式)

转载 作者:行者123 更新时间:2023-11-29 02:09:25 24 4
gpt4 key购买 nike

简短的解释。

我有一个ContainerViewController,我正在将其推送到navigationStack。

ContainerViewController 有 2 个子 ViewController。 SlidePanelViewController(滑出式菜单)和 CenterViewController(内容)

我的菜单中有一个“注销”按钮。单击此按钮后,我想将 ContainerViewController(它是 2 个 childViewControllers)推送到我的 LandingPageViewController

这是我要调用的函数:

func signOut() {
println("signOut")


// Set up the landing page as the main viewcontroller again.
let mainTableViewController = LandingPageVC()
mainTableViewController.navigationItem.setHidesBackButton(true, animated: false)
mainTableViewController.skipView = false
self.navigationController!.pushViewController(mainTableViewController, animated: true)

// Disable menu access
menuEnabled = false

// change status bar style back to default (black)
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default
}

起初,我尝试将其放入我的 SlidePanelViewController 中。那没有用。所以我把它放在 ContainerViewController 中我假设它所属的位置。

但是,当我单击菜单中的 signOutButton 时。我遇到了错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

查看错误时。这是导致它的行:

self.navigationController!.pushViewController(mainTableViewController, animated: true)

错误发生后,我通过添加调用该函数的 UINavigationBarButtonItem(在我的 ContainerViewController 中)检查该函数是否正常工作。它完全符合我的要求。

然而,当我从我的菜单中调用此函数时(同样,我的菜单是 ContainerViewControllerchildViewController)。它不起作用。

我试图这样调用它:

ContainerViewController().signOut()

我还尝试向我的 SidePanelViewController 添加一个 Delegate,如下所示:

上课前:

@objc protocol SidePanelViewControllerDelegate {
optional func needsSignOut(sender: SidePanelViewController)
optional func toggleLeftPanel()
optional func collapseSidePanels()
}

viewDidLoad() 中:

//  Make sure your delegate is weak because if a ContainerViewController owns
// a reference to a SidePanelViewController and the container view controller
// is its delegate, you'll end up with a strong reference cycle!
weak var delegate: SidePanelViewControllerDelegate?

在我的点击手势功能中:

func signOutTapGesture() {
println("signOutTapGesture")
selectView(signOutView)

delegate?.needsSignOut?(self)
println(delegate)
}

在我的ContainerViewController类之前:

var leftViewController: SidePanelViewController?

我的ContainerViewController类:

class ContainerViewController: UIViewController, CenterViewControllerDelegate, SidePanelViewControllerDelegate, UIGestureRecognizerDelegate {

在我的ContainerViewController的 viewDidLoad()

leftViewController?.delegate = self

我将 ContainerViewController 类中的 signOut 函数更改为:

func needsSignOut(sender: SidePanelViewController) {
println("needsSignOut called")
self.signOut()
}

但是像上面那样使用委托(delegate),似乎也没有做任何事情。

任何有关如何成功从菜单中推送 LandingPageVC 的帮助将不胜感激! (我没有使用 Storyboard)

最佳答案

您正在尝试使用 ContainerViewController().signOut() 调用 signOut。这将创建一个新的 ContainerViewController,因为您还没有将它插入导航 Controller 的堆栈,所以 navigationController 为 nil。尝试调用 self.signOut()。 (我假设 signOutContainerViewController 的方法中)

更新 - 代表

您的委托(delegate)属性应该放在 SidePanelViewController 中。我会给你和如何实现它的例子:

侧面板 View Controller :(注意 - 协议(protocol)不必放在此处,但我认为它可以使事情井井有条)

@objc protocol SidePanelViewControllerDelegate {
optional func needsSignOut(sender: SidePanelViewController)
}

class SidePanelViewController: UIViewController {
// Make sure your delegate is weak because if a ContainerViewController owns
// a reference to a SidePanelViewController and the container view controller
// is its delegate, you'll end up with a strong reference cycle!
weak var delegate: SidePanelViewControllerDelegate?

// Called when the UIButton is pressed.
func myButtonWasPressed() {
delegate?.needsSignOut?(self)
}
}

容器 View Controller :

class ContainerViewController: UIViewController {
var sidePanel: SidePanelViewController!
// Setup the side panel...

override func viewDidLoad() {
super.viewDidLoad()
sidePanel.delegate = self
}

func signOut() {
// Sign out stuff here.
}
}

// The ContainerViewController needs to conform to the SidePanelViewControllerDelegate
// protocol if we want the delegate to work. (This could have gone in the initial
// class declaration.)
extension ContainerViewController : SidePanelViewControllerDelegate {
func needsSignOut(sender: SidePanelViewController) {
self.signOut()
}
}

希望对您有所帮助。

关于ios - 从不活动的 Viewcontroller 推送到新的 Viewcontroller(以编程方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29444876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com