从父 ViewController 更改嵌入 TableViewController 的数据

Posted

技术标签:

【中文标题】从父 ViewController 更改嵌入 TableViewController 的数据【英文标题】:Change embeded TableViewController's data from parent ViewController 【发布时间】:2016-07-01 16:48:02 【问题描述】:

我正在尝试让用户按顶部的其中一个名称。当他们这样做时,子 TableViewController 将更改一个布尔值currentUserIsLoggedInUser

在我的FactsController 我有代码:

class FactsController: UIViewController 

    @IBOutlet weak var currentUserName: UIButton!
    @IBOutlet weak var friendUserName: UIButton!

    var currentPersonSelectedIsCurrentUser: Bool = false

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if (segue.identifier == "ChangePersonSegue") 

            let embed: FactsTableViewController = segue.destinationViewController as! FactsTableViewController
            embed.currentPersonSelectedIsCurrentUser = self.currentPersonSelectedIsCurrentUser
            embed.refresh //this doesn't call the function like id want it to
        
    

    func changeFactList() 
        //segue for table view controller for ___
        // call prepareForSegue
        performSegueWithIdentifier("ChangePersonSegue", sender: self)
    

    override func viewDidLoad() 
        //changethings(user)
    

    @IBAction func tappedUserName (sender: UIButton) 
        if currentPersonSelectedIsCurrentUser 

        
        else 
            currentPersonSelectedIsCurrentUser = true
            changeFactList()
            currentUserName.titleLabel?.textColor = UIColor.lightGrayColor()
            friendUserName.titleLabel?.textColor = UIColor.darkGrayColor()
        
    

    @IBAction func tappedFriendName (sender: UIButton) 
        if currentPersonSelectedIsCurrentUser 
            currentPersonSelectedIsCurrentUser = false
            changeFactList()
            // change text color
            currentUserName.titleLabel?.textColor = UIColor.darkGrayColor()
            friendUserName.titleLabel?.textColor = UIColor.lightGrayColor()
        
        else 

        
    

然后在我的FactsTableViewController 我有代码:

class FactsTableViewController: UITableViewController 

    let cellID = "factCell"

    var currentUserIsLoggedInUser: Bool = false

    //var currentUserName: String = ""
    var facts = [Fact]()
    var currentUser: User!
    var soUser: User!

    let ref: FIRDatabaseReference = FIRDatabase.database().reference()

    override func viewDidLoad() 
        if currentUserIsLoggedInUser 
            // make tableview for the current user
        
        else 
            // make tableview for the friend         
        
    

    func refresh() 
        self.tableView.reloadData()
    


如果有一种方法可以在按下按钮时从FactsController 发送一个布尔值,那会让一切变得更容易。

【问题讨论】:

它不会改变布尔值,它是一个全新的视图控制器 你想让另一个 ViewController 知道前一个控制器发生了什么事情并且应该改变它的布尔值吗? 【参考方案1】:

如果你愿意:

当按钮被打开时从 FactsController 发送一个布尔值的方法 按下

那么你需要一个代表。尽管如此,故事板并没有让您对这种情况有太多的控制。我会将您的 UI 移动到 nib 文件中,并手动添加 FactsTableViewController 作为子 VC。拥有这些类的实例,您可以更轻松地管理委托。

【讨论】:

对不起,我对 swift 有点陌生。当你说“我会在 nib 文件中移动你的 UI”时,你是什么意思? 没问题。有几种方法可以表示您的用户界面。当您使用 .storyboard 文件时,它通常包含您的所有屏幕并管理转换。 “旧”方式是使用 .xib 文件。每个屏幕都有一个 .xib 文件,它只包含一个视图。这种方法要求您管理屏幕之间的所有转换。在您的情况下,您将拥有:FactsController.swiftFactsController.xibFactsTableViewController.swiftFactsTableViewController.xib。我建议你搜索主题“storyboard vs xibs”和“如何从你的项目中删除storyboards”

以上是关于从父 ViewController 更改嵌入 TableViewController 的数据的主要内容,如果未能解决你的问题,请参考以下文章

应该从父 ViewController 还是子 ViewController 调用 popViewController?

将数据从父 ViewController 传递到子 VC,无需故事板 - Swift 5

将新的 ViewController 嵌入到现有的 UITabBarController 中?

从父类访问变量

从父实体映射中将可嵌入字段设置为主键 - Doctrine2

从父级导航嵌入式 Google Apps 脚本 iFrame