Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中从另一个类更新对象的实例变量_Ios_Swift - Fatal编程技术网

Ios 在Swift中从另一个类更新对象的实例变量

Ios 在Swift中从另一个类更新对象的实例变量,ios,swift,Ios,Swift,有两个UIViewController类。其中一个是UITableViewController,当needupdate变量为true时,它将重新加载其数据。 此变量应在另一个类中更新 我从中创建了一个实例并更改了这个变量,但我认为由于这个实例不是运行任何更改的实例,因此needupdate不会更新 class A: UITableViewController{ var needUpdating: Bool = false override func viewWillAppear(

有两个
UIViewController
类。其中一个是
UITableViewController
,当
needupdate
变量为true时,它将重新加载其数据。
此变量应在另一个类中更新

我从中创建了一个实例并更改了这个变量,但我认为由于这个实例不是运行任何更改的实例,因此
needupdate
不会更新

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

连接的,每个对象都有自己的属性,因此在这里您要创建一个新实例:

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)
按如下方式传递实例:

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)

每个对象都有自己的属性,因此在这里您将创建一个新的实例:

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)
按如下方式传递实例:

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)

这是第一个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
    }
 }
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.
    }
}
这是第二个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
    }
 }
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.
    }
}

这是第一个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
    }
 }
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.
    }
}
这是第二个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
    }
 }
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.
    }
}

在Appdelegate类中,创建UITableViewController变量

'var tableViewController: A?'
在你的班级里,做这样的改变

"

在类B中,使用AppDelegate变量引用,而不是创建新实例

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

在Appdelegate类中,创建UITableViewController变量

'var tableViewController: A?'
在你的班级里,做这样的改变

"

在类B中,使用AppDelegate变量引用,而不是创建新实例

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

您可以根据需要使用任何类型的
segue
。我已经使用了
Present Modally
segue
来呈现控制器
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
方法以使其正常工作。

您可以根据需要使用任何类型的
segue
。我已经使用了
Present Modally
segue
来呈现控制器
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
方法使其工作。

您可以使用协议。编写一个协议,并在导航时对实例进行自映射,并使用值调用它,以便可以在第一个类中更新变量。如果你愿意,我可以写一个示例代码。@Mina谢谢。如果您不介意,请发送示例代码。@FattanehTalebi检查下面的答案。使用委托模式(协议)在控制器之间传递数据。您可以使用协议。编写一个协议,并在导航时对实例进行自映射,并使用值调用它,以便可以在第一个类中更新变量。如果你愿意,我可以写一个示例代码。@Mina谢谢。如果您不介意,请发送示例代码。@FattanehTalebi检查下面的答案。使用委托模式(协议)在控制器之间传递数据。您没有在应用程序委托中保留编程错误的实例,因为ARC将永远不会在整个应用程序中删除该实例。您没有在应用程序委托中保留编程错误的实例,因为ARC将永远不会在整个应用程序中删除该实例。您可以吗解释如何创建名为Next的segue。我试着将控件从B视图控制器拖动到视图控制器和一些片段,如show和。。。已显示,但我不想向管理员显示控制器。我只想设置它的变量。您必须
self
viewcontrollersecondelegate。你可以在任何你有DesireControl实例的地方这样做。我
vc?.delegate=self
prepare
中创建它,因为那里有我的目标控制器的实例。你能解释一下我应该如何创建名为Next的segue吗。我试着将控件从B视图控制器拖动到视图控制器和一些片段,如show和。。。已显示,但我不想向管理员显示控制器。我只想设置它的变量。您必须
self
viewcontrollersecondelegate。你可以在任何你有DesireControl实例的地方这样做。我
vc?.delegate=self
prepare
中创建它,因为那里有我的目标控制器的实例。谢谢。我应该在哪里调用pushToB?@FattanehTalebi当你推送你的viewcontroller时,它会给你实例,然后用viewcontroller实例调用。如果你不明白,请提供完整的代码谢谢。我应该在哪里调用pushToB?@FattanehTalebi当你推送你的viewcontroller时,它会给你一个实例,然后用viewcontroller实例调用。如果你不明白,请提供完整的代码