在容器视图中更新内容

时间:2016-10-08 22:31:21

标签: ios swift uicontainerview

我在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文本为空:

我认为这是因为我没有更新容器视图中的代码,所以字符串仍然是空的。

所以问题是容器视图没有正确显示标题标签,我认为这是因为没有更新容器视图,但我实际上并不知道如何更新容器视图。

4 个答案:

答案 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),因此无法运行您的代码。