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实例调用。如果你不明白,请提供完整的代码