2017-08-11 208 views
0

所以我有我的iOS应用程序的以下布局。如何从另一个控制1个视图控制器?

Storyboard Layout!

什么我打算做的就是把在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

+0

不完全确定这是否可以通过导航控制器工作,我做了类似的事情,但是从一个View Controller直接转到另一个。基本上这个想法是创建一个委托,并符合第二个VC中的委托。首先在第二个视图控制器中触发一个方法的VC(以所需的方式控制它),然后当我想执行这个循环时,我会加载第二个VC并显示它。 也许类似的东西可以帮助你。 –

回答

0

它取决于案件,但看几个例子:

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)您可以在任何控制器可能使用的通知在通知中心发布自定义通知,其他控制器可能会观察通知并采取相应措施。

这样做还有很多其他的方法,但这可能是最受欢迎的。看看他们中的任何一个是否适合你...

0

代表团。

您的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]) 
    } 
} 
+0

好的,我是新来的委托人,所以大脑还没有那么完美......那么我如何控制紫色的绿色然后......所以如果我点击一个紫色的按钮,我就会改变绿色的VC。 .. – BostonMacOSX

+0

当你点击紫色的一行时,它会在MainViewController中调用'selectedRow'。 'selectedRow'可以使用'greenVC'属性来调用'GreenViewController'上的方法和属性。像'greenVC?.someProperty = value'或'greenVC?.doSomethingUseful()'。 – vacawama

+0

啊,谢谢......最后一件事。如果我想换出其他视图控制器的绿色.....(这就是为什么我把导航在那里)我打算紫色的一个是“菜单”,绿色是内容... – BostonMacOSX

相关问题