如何从另一个控制1个视图控制器?
所以我有我的iOS应用程序的以下布局。如何从另一个控制1个视图控制器?
什么我打算做的就是把在purpleVC表格视图来控制绿色的ViewController ...顶peachVC将在它的文字,这将需要改变。我只是不确定如何控制另一个视图控制器。这包括当单击GreenVC上的按钮时将紫色幻灯片放入和放出。我知道有些课程可以做到这一点,但我也想学习。
测试代表团:
MAINVIEW CONTROLER
import UIKit
protocol Purpleprotocol {
func buttonpressed()
}
protocol Greenprotocol {
}
extension UIViewController {
func alert(message: String, title: String = "") {
let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
let OKAction = UIAlertAction(title: "OK", style: .default, handler: nil)
alertController.addAction(OKAction)
self.present(alertController, animated: true, completion: nil)
}
}
class MainViewController: UIViewController,Purpleprotocol,Greenprotocol {
weak var infoNav : UINavigationController?
weak var greenVC: GreenVC?
weak var purpleVC: PurpleVC?
weak var peachVC: PeachVC?
func buttonpressed() {
alert(message: "This is message")
print("buttonpressed")
let date = Date()
let calendar = Calendar.current
let hour = calendar.component(.hour, from: date)
let minutes = calendar.component(.minute, from: date)
greenVC?.greenlabel.text = String(hour) + ":" + String(minutes)
}
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.
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "contentSegue" {
let infoNav = segue.destination as! UINavigationController
}
}
}
PURPLEVIEW CONTROLER
class PurpleVC: UIViewController {
var delegate: Purpleprotocol?
@IBAction func butclick(_ sender: UIButton) {
alert(message: "infunction")
delegate?.buttonpressed()
}
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.
}
感谢 [R
它取决于案件,但看几个例子:
A)你可以通过委托连接。你的主视图控制器有3个子视图控制器,它应该向其报告更改。它也应该将自己分配给所有3个子控制器的代表,在那里它将获得所有事件通知。这看起来像
func purpleViewController(sender: PVC, selectedItem: Item) {
self.greenViewController.showItem(item: selectedItem)
self.peachVC.showItem(item: selectedItem)
}
func purpleViewController(sender: PVC, shouldSetMenuClosed closed: Bool) {
self.menuConstraint.constant = closed ? targetWidth : 0.0
}
B)您可能需要控制整个屏幕,并针对每个孩子的代表的数据模型。该模型将向其代表报告任何变更,以便他们可以做出相应的反应。主视图控制器在加载时会创建该模型的一个实例,并将其传递给所有子视图控制器。然后,孩子们会直接操作模型:
在绿色控制器:
func onTap() {
mode.menuShown = !mode.menuShown
}
在模型:
var menuShown: Bool = true {
didSet {
self.menuDelegate.model(self, changedMenuShownStateTo: menuShown)
}
}
在主视图控制器:
func model(_ sender: Model, changedMenuShownStateTo shown:Bool) {
self.menuConstraint.constant = shown ? 0.0 : targetWidth
}
C)您可以在任何控制器可能使用的通知在通知中心发布自定义通知,其他控制器可能会观察通知并采取相应措施。
这样做还有很多其他的方法,但这可能是最受欢迎的。看看他们中的任何一个是否适合你...
代表团。
您的MainViewController
将成为每个想要传回信息的嵌入式VC的代表。从你的描述你需要两个代表关系:
protocol PurpleProtocol {
func selected(row: Int, text: String)
}
protocol GreenProtocol {
func slideButtonPressed()
}
有MainViewController实现这些协议。给标识符嵌入段落。您可以在文档大纲视图中找到它们。在prepareForSegue,保留指针到嵌入式VC的,并通过你自己的委托:
class MainViewController: UIViewController, PurpleProtocol, GreenProtocol {
weak var greenVC: GreenViewController?
weak var purpleVC: PurpleViewController?
weak var peachVC: PeachViewController?
func selectedRow(row: Int, text: String) {
// do something useful
}
func slideButtonPressed() {
// slide purple view in or out depending on current state
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "EmbedPurple" {
let dvc = segue.destination as! PurpleViewController
purpleVC = dvc
dvc.delegate = self
}
else if segue.identifier = "EmbedGreen" {
let nav = segue.destination as! UINavigationController
let dvc = nav.topViewController as! GreenViewController
greenVC = dvc
dvc.delegate = self
} else if segue.identifier = "EmbedPeach" {
peachVC = segue.destination as! PeachViewController
}
}
}
在嵌入式VC的,添加一个delegate
指针调用该委托与协议方法时,它是时间:
class GreenViewController: UIViewController {
weak var delegate: GreenProtocol?
@IBAction slideButtonPressed(sender: UIButton) {
delegate?.slideButtonPressed()
}
}
class PurpleViewController: UITableViewController {
weak var delegate: PurpleProtocol?
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
delegate?.selected(row: indexPath.row, text: modelArray[indexPath.row])
}
}
好的,我是新来的委托人,所以大脑还没有那么完美......那么我如何控制紫色的绿色然后......所以如果我点击一个紫色的按钮,我就会改变绿色的VC。 .. – BostonMacOSX
当你点击紫色的一行时,它会在MainViewController中调用'selectedRow'。 'selectedRow'可以使用'greenVC'属性来调用'GreenViewController'上的方法和属性。像'greenVC?.someProperty = value'或'greenVC?.doSomethingUseful()'。 – vacawama
啊,谢谢......最后一件事。如果我想换出其他视图控制器的绿色.....(这就是为什么我把导航在那里)我打算紫色的一个是“菜单”,绿色是内容... – BostonMacOSX
不完全确定这是否可以通过导航控制器工作,我做了类似的事情,但是从一个View Controller直接转到另一个。基本上这个想法是创建一个委托,并符合第二个VC中的委托。首先在第二个视图控制器中触发一个方法的VC(以所需的方式控制它),然后当我想执行这个循环时,我会加载第二个VC并显示它。 也许类似的东西可以帮助你。 –