2017-06-13 20 views
0

有兩個類UIViewController。其中一個是UITableViewController,當needUpdating變量爲真時,它將重新載入其數據。
這個變量應該在另一個類中更新。在Swift中更新另一個類的對象的實例變量

我從它做一個實例,並改變這個變量,但我認爲,因爲這個實例不是沒有運行任何變化,所以needUpdating不更新。

class A: UITableViewController{ 
    var needUpdating: Bool = false 
    override func viewWillAppear(animated: Bool) { 
     ... 
     if needUpdating { 
      tableView.reloadData() 
     } 
    } 
} 
class B: UIViewController { 
    override func viewWillAppear(animated: Bool) { 
     ... 
     var a = A() 
     if ... { 
      a.needUpdating = true 
     } 
    } 
} 

這兩個UIViewController無關。他們使用segue

+1

你可以使用協議。 在導航時編寫一個協議和自己的實例,並用該值調用它,以便可以更新第一個類中的變量。 我可以寫一個示例代碼,如果你想。 – Mina

+0

@Mina謝謝。如果您不介意,請發送您的示例代碼。 –

+0

@FattanehTalebi查看下面的答案。 –

回答

2

這是第一次的viewController:

class ViewController: UIViewController, ViewControllerSecondDelegate { 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "Next" { 
     let vc = segue.destination as? ViewControllerSecond 
     vc?.delegate = self 
    } 
    } 
    func secondDelegate(_ value: Bool) { 
     print("delegate") //needUpdating = value 
    } 
} 

,這是secondViewController:

protocol ViewControllerSecondDelegate { 
    func secondDelegate(_ value: Bool) 
} 

class ViewControllerSecond: UIViewController { 
    weak var delegate: ViewControllerSecondDelegate? 

    override func viewDidDisappear(_ animated: Bool) { 
     super.viewDidDisappear(animated) 
     delegate?.secondDelegate(true) //call this wherever you need it. 
    } 
} 
+0

你能解釋我應該如何創建名爲下一個segue。我試圖控制從B視圖控制器拖動到視圖控制器,並顯示一些像顯示和...等賽段,但我不想向A顯示控制器。我只是想設置它的變量。 –

+1

你必須'自我'ViewControllerSecondDelegate。你可以在你有desireController的實例的地方做到這一點。我'vc?.delegate = self'它在'prepare'中,因爲那是我的目標控制器實例。 – Mina

1

每個對象都有自己的屬性,以便您可以創建一個新的實例未連接:

class B: UIViewController { 
    override func viewWillAppear(animated: Bool) { 
     var a = A() 
     if ... { 
      a.needUpdating = true 
     } 
    } 
} 

var a = A() 

你要通過你的舊實例不創建新實例var a = A()

你可以通過你舊的實例是這樣的:

class A: UITableViewController{ 
    var needUpdating: Bool = false 
    override func viewWillAppear(animated: Bool) { 
     ... 
     if needUpdating { 
      tableView.reloadData() 
     } 
    } 
    //WHEN YOU PUSHED TO B ASSIGN THE CLASS A INSTANCE IN B CLASSS 
    func pushToB { 
     //PUSH STUFF 
     var b = B() 
     b.a = self 

    } 
} 
class B: UIViewController { 
    var a:A? 
    override func viewWillAppear(animated: Bool) { 
     if ... { 
      a?.needUpdating = true 
     } 
    } 
} 

通過了實例是這樣的:

let instance = self.storyboard?.instantiateViewControllerWithIdentifier("B")as! B 
instance.a = self 
self.navigationController?.pushViewController(instance, animated: true) 
+0

謝謝。我應該在哪裏調用pushToB? –

+0

@FattanehTalebi當你推動你的viewcontroller它給你的實例,然後用viewcontroller實例調用。 –

+0

如果你不明白,然後提供完整的代碼 –

0

在你的AppDelegate類做的一個變量UITableViewController

'var tableViewController: A?' 

在類中做出這種改變

'

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    class A: UITableViewController{ 
     var needUpdating: Bool = false 
     override func viewWillAppear(animated: Bool) { 
      ... 
      appDelegate.tableViewController = self 
      if needUpdating { 
       tableView.reloadData() 
      } 
     } 
    }' 

在你的B級使用的AppDelegate變量的引用,而不是創建新實例

'class B: UIViewController { 
    override func viewWillAppear(animated: Bool) { 
     ... 
     var a = appDelegate.tableViewController 
     if ... { 
      a.needUpdating = true 
     } 
    } 
}' 
+0

您的應用程序委託中沒有保存實例,這是不好的編程,因爲ARC永遠不會刪除整個應用程序中的實例。 –

0

enter image description here

你可以的根據您的要求使用任何類型的segue。我已經使用Present Modallysegue呈現控制器B

class A: UITableViewController 
{ 
    var needUpdating: Bool = false 
    override func viewWillAppear(_ animated: Bool) 
    { 
     super.viewWillAppear(animated) 
     //... 
     if needUpdating 
     { 
      tableView.reloadData() 
     } 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    { 
     if segue.identifier == "BController" 
     { 
      let controller = segue.destination as! B 
      controller.a = self 
     } 
    } 
} 
class B: UIViewController 
{ 
    var a = A() 

    override func viewWillAppear(_ animated: Bool) 
    { 
     super.viewWillAppear(animated) 
     //... 
     if ... 
     { 
      a.needUpdating = true 
     } 
    } 
} 

還需要添加UITableViewDataSource方法,使其工作。

相關問題