解决了它:我忘了在VC1中声明tvx.selectionDelegate = self,这就是为什么它从未执行过
我搜索了很长时间并在网上为我的问题提供了两个类似的答案: here
但是所有这些都与解雇然后呈现另一种观点有关,我想解雇并推送另一个ViewC。
我有3个ViewController:
VC1让它调用它:DownloadsViewController
VC2允许调用它:SelectActionController
VC3允许调用它:fileInfoView
VC1以模态方式呈现VC2,然后VC2应该解除,VC1应立即推送VC3。
我试过了:
VC2:
self.present(vx, animated: true, completion: nil)
并将PUSH动画置于完成{}但它崩溃了。
我接下来要尝试的是委托代表,如果我按下VC2上的按钮,则调用VC1来解除VC2和推送VC3。喜欢这里:
VC2:
protocol PushViewControllerDelegate: class {
func pushViewController(_ controller: UIViewController)
}
class SelectActionController: UIViewController, UITableViewDelegate, UITableViewDataSource {
weak var delegate: PushViewControllerDelegate?
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
if self.delegate != nil {
self.delegate?.pushViewController(self)}
VC1:
func pushViewController(_ controller: UIViewController) {
controller.dismiss(animated: true) { () -> Void in
self.performSegue(withIdentifier: self.segue2, sender: nil)
//let vx = self.storyboard?.instantiateViewController(withIdentifier: "FileInfo") as! fileInfoView
//self.navigationController?.pushViewController(vx, animated: false)
}
}
我尝试的Trird事情是创建一个全局变量,如果它解散,只需将Bool变量设置为true,VC1中的func应该识别它(我的意图)。唯一的问题是它没有认定解雇为ViewDidAppear或类似的东西。
所以这些都没有用。
有没有人有这个想法?
答案 0 :(得分:1)
已编辑
只需使用协议。 让你的第一个控制器采用它,并添加所需的功能。 在第二个控制器中设置一个协议变量,该变量将第一个参考变量作为参考,并在您关闭第二个控制器时调用该函数。 您现在可以使用dismiss函数执行任何操作,传递数据,发送到其他控制器......
第一个视图控制器:
protocol CustomProtocol {
func dismissed()
}
class AViewController: UIViewController, CustomProtocol {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func toVC2(_ sender: UIButton) {
let VC = self.storyboard!.instantiateViewController(withIdentifier: "BViewController") as! BViewController
VC.customProtocol = self
VC.view.backgroundColor = .white
self.present(VC, animated: true, completion: nil)
}
func dismissed() {
let yourViewController = UIViewController()
yourViewController.view.backgroundColor = .red
guard let navigationController = self.navigationController else {return}
navigationController.pushViewController(yourViewController, animated: true)
}
}
第二个视图控制器:
class BViewController: UIViewController {
var customProtocol: CustomProtocol?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func quit(_ sender: UIButton) {
self.dismiss(animated: true) {
guard let proto = self.customProtocol else {return}
proto.dismissed()
}
}
}
答案 1 :(得分:0)
我希望您需要对
执行解雇操作public func tableView(_ tableView: UITableView, didSelectRowAt indexPath:
在" SelectActionController"对吗?
在这种情况下,您必须执行以下操作,
public func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath) {
if self.delegate != nil {
dismiss(animated: true) {
self.delegate?.pushViewController(self)}
}
}
我已经分享了一个与您的情况相关的示例项目,请参考。 https://github.com/Bharath-MallowTech/StackoverflowSolutions/tree/master/viewcontrollerDismissAndPush
答案 2 :(得分:0)
你能发布一些关于你一直尝试过的代码吗?这里的self
是什么?是VC1
,VC2
还是VC3
?
您可以做的是查看协议,因此您将VC1
用作delegate
,当您解除VC2
时,它也会调用它的委托showVC3()
。然后,将delegate.showVC3()
放入dismiss
的完成块中。
// Declare it in VC1
@protocol MyDelegate {
func showVC3()
}
class VC1: UIViewController, MyDelegate {
var vc2: VC2ViewController = VC2ViewController()
var vc3: VC3ViewController = VC3ViewController()
func showVC2() {
vc2.delegate = self
self.present(self.vc2)
}
func showVC3() {
self.present(self.vc3)
}
}
// In VC2
class VC2: UIViewController {
var delegate: MyDelegate?
func closeVC2() {
self.dismiss(animated: true, completion: {
self.delegate?.showVC3()
})
}
}
不确定这是否有效,因为我现在在我的电脑上,所以还没有尝试过。但是根据你的需要改变它并测试它。
答案 3 :(得分:0)
根据你在Github的文件,我想你忘了申报
tvx.selectionDelegate = self
中的
func imagePressed
答案 4 :(得分:0)
即使我有相同的情况,在呈现视图控制器后,我需要推送到其他视图控制器。如果我们有vc1,vc2,vc3,我们从vc1提供vc2,然后在按钮点击vc2我们需要推送到vc3,我做的是,我将vc3设置为root视图控制器。您可以按照以下方式检查代码。
func goToHomeScreenPage(transition : Bool)
{
let _navigation : UINavigationController!
let startVC : TabbarViewController = Utilities.viewController(name: "TabbarViewController", onStoryboard: StoryboardName.Login.rawValue) as! TabbarViewController
_navigation = UINavigationController(rootViewController: startVC)
_navigation.setNavigationBarHidden(true, animated: true)
let transitionOption = transition ? UIViewAnimationOptions.transitionFlipFromLeft : UIViewAnimationOptions.transitionFlipFromLeft
gotoViewController(viewController: _navigation, transition: transitionOption)
}
上面的方法gotoviewcontroller()在下面,
func gotoViewController(viewController: UIViewController, transition: UIViewAnimationOptions)
{
if transition != UIViewAnimationOptions.transitionCurlUp
{
UIView.transition(with: self.window!, duration: 0.5, options: transition, animations: { () -> Void in
self.window!.rootViewController = viewController
}, completion: { (finished: Bool) -> Void in
// do nothing
})
} else {
window!.rootViewController = viewController
}
}
在顶部声明var window: UIWindow?
,您可以在appdelegate中编写这些方法,并通过创建appdelegate实例来调用它们。