我在View Controller中有一个Container View。当用户按下按钮时,将显示容器视图,但容器视图上的文本基于用户按下的按钮。要做到这一点,我需要更新容器视图,但我不知道如何做到这一点。
这是我的容器视图代码:
override func viewDidLoad() {
super.viewDidLoad()
Cancel_Button.hidden = true
Save_Button.hidden = true
let Storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let ViewController: View = Storyboard.instantiateViewControllerWithIdentifier("View") as! View
Title_String = ViewController.String
Title_Label.text = Title_String
}
这是我的View Controller中的代码:
@IBOutlet var View_Controller_Popup: UIView!
var String = String()
override func viewDidLoad() {
super.viewDidLoad()
View_Controller_Popup.hidden = true
}
@IBAction func Button_Pressed(sender: AnyObject) {
let Storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let ViewController: ContainerView = Storyboard.instantiateViewControllerWithIdentifier("Container") as! ContainerView
self.String = "Specific Title"
ViewController.Title_String = self.String
self.View_Controller_Popup.hidden = false
}
那么如何重新加载容器视图,以便在按下按钮时,容器视图会显示基于按下按钮的标签文本。
更新
由于有些人无法理解我遇到的问题,我会用图片重新解决问题。
这是我的观点:
图片已被删除
如您所见,有许多按钮(带图标)。当用户按下按钮时,我想要一个容器视图弹出显示信息:
因此,对于每个按钮,Label文本必须不同。但目前在应用程序中,字符串为空,因此Label文本为空:
我认为这是因为我没有更新容器视图中的代码,所以字符串仍然是空的。
所以问题是容器视图没有正确显示标题标签,我认为这是因为没有更新容器视图,但我实际上并不知道如何更新容器视图。
答案 0 :(得分:1)
尝试使用委托协议 你的containerView应该扩展父代表协议,并简单地用参数func updateContent(id:Int)实现函数
protocol ContentDelegate {
func updateContent(id: Int)
}
class ParentViewController: UIViewController {
var delegate: ContentDelegate?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "containerController") {
let containerVC = segue.destination as! ChildContainerViewController
self.delegate = containerVC
}
}
}
class ChildContainerViewController: UIViewController, ContentDelegate {
func updateContent(id: Int) {
// your code
}
}
答案 1 :(得分:1)
这就是我使用Swift 5的方式。基本上,您遍历子级以获取所需VC的引用。无论仅存在一个还是多个子视图控制器,该方法都有效。
if let vc = children.filter({$0 is ContainerViewController}).first as? ContainerViewController {
vc.setupView()
}
答案 2 :(得分:0)
我不完全确定你在问什么,但我会尝试回答。如果我误解了,请告诉我。
这里的关键只是你的架构。我建议为每个按钮使用独特的动作方法。这看起来像是:
@IBAction func ButtonOnePressed(sender: AnyObject) {
initializeContainerView(withTitle: "Button One Title")
}
@IBAction func ButtonTwoPressed(sender: AnyObject) {
initializeContainerView(withTitle: "Button Two Title")
}
func initializeContainerView(withTitle title: String) {
let Storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let ViewController: ContainerView = Storyboard.instantiateViewControllerWithIdentifier("Container") as! ContainerView
ViewController.Title_String = title
self.View_Controller_Popup.hidden = false
}
但是,如果您希望/要求在按钮之间使用相同的操作方法,请在按钮UIButton.tag
中添加标签。然后只需在操作方法中使用switch语句来检查sender.tag并运行该案例的代码。这看起来像是:
@IBAction func Button_Pressed(sender: AnyObject) {
switch sender.tag {
case buttonOneTagValue:
initializeContainerView(withTitle: "Button One Title")
case buttonTwoTagValue:
initializeContainerView(withTitle: "Button Two Title")
default:
break
}
func initializeContainerView(withTitle title: String) {
let Storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let ViewController: ContainerView = Storyboard.instantiateViewControllerWithIdentifier("Container") as! ContainerView
ViewController.Title_String = title
self.View_Controller_Popup.hidden = false
}
答案 3 :(得分:0)
在initializeContainerView
方法中,更改:
self.Day_Period_String = title
ViewController.Title_String = self.Day_Period_String
为:
ViewController.Title_String = title
在容器视图控制器中,删除:
Title_String = ViewController.Day_Period_String
最后更改此行:
var Title_String = String()
为:
var Title_String: String!
如果这不起作用,我将要添加一些打印行。不幸的是我已经更新到XCode 8(以及Swift 3),因此无法运行您的代码。