我有三个viewControllers 主要, A , B 。 主ViewController 包含 ContainerView 以及其他内容以及containerView中的所有事务。 ViewControllerA 按 ButtonA 时,容器的内容必须更改为 ViewControllerB 我怎样才能做到这一点?我找不到任何类似的例子。
答案 0 :(得分:1)
您需要为此创建创建委托。 首先创建一个协议
protocol ViewControllerADelagate {
func didPressOnButtonA()
}
在ViewControllerA中添加以下委托变量
class ViewControllerA {
....
var delegate : ViewControllerADelagate?
....
}
在ViewControllerA中按下按钮
@IBAction buttonAPressed(sender : UIButton) {
self.delegate?.didPressOnButtonA()
}
在MainViewController中,将ViewControllerA的委托指定给self 喜欢
vcA.delegate = self
在MainViewController中实现委托方法,如
func didPressOnButtonA {
let storyboard : UIStoryboard = UIStoryboard(name: storyboard, bundle: nil)
let vcB : UIViewController = storyboard.instantiateViewController(withIdentifier: viewControllerIdentifier) as! ViewControllerB
self.addChildViewController(vcB)
self.containerView.addSubview(vcB.view)
vcB.didMove(toParentViewController: self)
vcB.view.frame = CGRect.init(x: 0, y: 0, width: self.containerView.frame.size.width, height: self.containerView.frame.size.height)
}
答案 1 :(得分:1)
点击ButtonA。向mainView发布通知。从Container中删除viewController A并添加View Controller B.
答案 2 :(得分:0)
从视图A:
按Button A
时
@IBAction func BtnAPress(_ sender: Any)
{
//Moving Storyboard
let Storyboard = UIStoryboard(name: "Main", bundle: nil)
let MainVC : UIViewController = Storyboard.instantiateViewController(withIdentifier: "ViewControllerB")
self.present(MainVC, animated: true, completion: nil)
}
答案 3 :(得分:0)
我用样本创建了一个故事。您可以从here下载。
您需要将嵌入视图更改为导航控制器,然后您可以使用segue在按下按钮时显示第二个视图。隐藏/显示导航栏取决于要求。
答案 4 :(得分:0)
我不喜欢使用这些,但您可以通过访问数组childViewControllers
从父控制器获取子视图控制器。在视图上加载了你需要经历所有这些并找到可以类型转换为你的视图控制器类型的那个,如
childViewControllers.flatMap { $0 as? AViewController }.first
。
现在您找到了正确的视图控制器,我建议您将自己指定为代理
childViewControllers.flatMap { $0 as? AViewController }.first.delegate = self
或只是添加按钮目标
childViewControllers.flatMap { $0 as? AViewController }.first.button.addTarget...
现在,如果您只是同时嵌入2个视图控制器(有2个内容视图)并根据您显示的内容隐藏其中一个,则可以轻松完成此操作。至少这种方式可以直接分配连接。如果不是这种情况,那么在设置新控制器时需要再次迭代,或者在初始化新视图控制器时分配连接。
在这种情况下,最好转动系统:当加载子视图控制器而不是调用
self.delegate = parentViewController as? AViewControllerDelegate
虽然这样可行,但是子视图控制器会控制其监听器是谁,这似乎是错误的,所以我建议你避免这样的编码。
我通常使用容器视图的自定义实现,您可以执行相同的操作,或者至少是本机实现的子类并定位方法,以便您的代码看起来像:
private onBPressed() {
containerView.setViewController(viewController: BViewController(delegate: self), animation: .fade)
}