Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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
Class swift ios委托在多个类中同时运行_Class_Swift_Delegates - Fatal编程技术网

Class swift ios委托在多个类中同时运行

Class swift ios委托在多个类中同时运行,class,swift,delegates,Class,Swift,Delegates,啊 我正在使用学习swift的教程,现在我想知道这是否可行 或者如何以更好的方式实现这一点 斯威夫特 protocol AControllerProtocol { func updateGui() } class AController { func doSomething(){ // here I get incomming data and other stuff // then the gui in multiple views needs an upda

我正在使用学习swift的教程,现在我想知道这是否可行

或者如何以更好的方式实现这一点

斯威夫特

protocol AControllerProtocol {
    func updateGui()
}

class AController {
    func doSomething(){
    // here I get incomming data and other stuff
    // then the gui in multiple views needs an update
    self.delegate.updateGui()
    }

    var delegate: AControllerProtocol
    init(delegate: AControllerProtocol) {
    self.delegate = delegate
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
    super.viewDidLoad()
    acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()
    // works, it runs this method and this tables is inside this BViewController 
    // })
    }
}
class CViewController: AController {
    lazy var acontroller : AController = AController(delegate: self)

    @IBOutlet weak var tracksTableView: UITableView!

    func updateGui() {
        // dispatch_async(dispatch_get_main_queue(), {
        self.tracksTableView!.reloadData()
        // din't run, this table is only in this CViewController
        // it only did run BViewController updateGui()
    // })
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
        super.viewDidLoad()
        acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()

    // get to know how to do this here
    CViewController.tracksTableView!.reloadData()
    // })
    }
}
class CViewController {
    @IBOutlet weak var tracksTableView: UITableView!
}
BViewController.swift

protocol AControllerProtocol {
    func updateGui()
}

class AController {
    func doSomething(){
    // here I get incomming data and other stuff
    // then the gui in multiple views needs an update
    self.delegate.updateGui()
    }

    var delegate: AControllerProtocol
    init(delegate: AControllerProtocol) {
    self.delegate = delegate
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
    super.viewDidLoad()
    acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()
    // works, it runs this method and this tables is inside this BViewController 
    // })
    }
}
class CViewController: AController {
    lazy var acontroller : AController = AController(delegate: self)

    @IBOutlet weak var tracksTableView: UITableView!

    func updateGui() {
        // dispatch_async(dispatch_get_main_queue(), {
        self.tracksTableView!.reloadData()
        // din't run, this table is only in this CViewController
        // it only did run BViewController updateGui()
    // })
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
        super.viewDidLoad()
        acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()

    // get to know how to do this here
    CViewController.tracksTableView!.reloadData()
    // })
    }
}
class CViewController {
    @IBOutlet weak var tracksTableView: UITableView!
}
CViewController.swift

protocol AControllerProtocol {
    func updateGui()
}

class AController {
    func doSomething(){
    // here I get incomming data and other stuff
    // then the gui in multiple views needs an update
    self.delegate.updateGui()
    }

    var delegate: AControllerProtocol
    init(delegate: AControllerProtocol) {
    self.delegate = delegate
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
    super.viewDidLoad()
    acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()
    // works, it runs this method and this tables is inside this BViewController 
    // })
    }
}
class CViewController: AController {
    lazy var acontroller : AController = AController(delegate: self)

    @IBOutlet weak var tracksTableView: UITableView!

    func updateGui() {
        // dispatch_async(dispatch_get_main_queue(), {
        self.tracksTableView!.reloadData()
        // din't run, this table is only in this CViewController
        // it only did run BViewController updateGui()
    // })
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
        super.viewDidLoad()
        acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()

    // get to know how to do this here
    CViewController.tracksTableView!.reloadData()
    // })
    }
}
class CViewController {
    @IBOutlet weak var tracksTableView: UITableView!
}
如你所见,我有两种观点:

BViewController.swift

protocol AControllerProtocol {
    func updateGui()
}

class AController {
    func doSomething(){
    // here I get incomming data and other stuff
    // then the gui in multiple views needs an update
    self.delegate.updateGui()
    }

    var delegate: AControllerProtocol
    init(delegate: AControllerProtocol) {
    self.delegate = delegate
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
    super.viewDidLoad()
    acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()
    // works, it runs this method and this tables is inside this BViewController 
    // })
    }
}
class CViewController: AController {
    lazy var acontroller : AController = AController(delegate: self)

    @IBOutlet weak var tracksTableView: UITableView!

    func updateGui() {
        // dispatch_async(dispatch_get_main_queue(), {
        self.tracksTableView!.reloadData()
        // din't run, this table is only in this CViewController
        // it only did run BViewController updateGui()
    // })
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
        super.viewDidLoad()
        acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()

    // get to know how to do this here
    CViewController.tracksTableView!.reloadData()
    // })
    }
}
class CViewController {
    @IBOutlet weak var tracksTableView: UITableView!
}
  • 桌面视图
CViewController.swift

protocol AControllerProtocol {
    func updateGui()
}

class AController {
    func doSomething(){
    // here I get incomming data and other stuff
    // then the gui in multiple views needs an update
    self.delegate.updateGui()
    }

    var delegate: AControllerProtocol
    init(delegate: AControllerProtocol) {
    self.delegate = delegate
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
    super.viewDidLoad()
    acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()
    // works, it runs this method and this tables is inside this BViewController 
    // })
    }
}
class CViewController: AController {
    lazy var acontroller : AController = AController(delegate: self)

    @IBOutlet weak var tracksTableView: UITableView!

    func updateGui() {
        // dispatch_async(dispatch_get_main_queue(), {
        self.tracksTableView!.reloadData()
        // din't run, this table is only in this CViewController
        // it only did run BViewController updateGui()
    // })
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
        super.viewDidLoad()
        acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()

    // get to know how to do this here
    CViewController.tracksTableView!.reloadData()
    // })
    }
}
class CViewController {
    @IBOutlet weak var tracksTableView: UITableView!
}
  • tracksTableView
控制器获取一些数据,然后激发委托。 我认为它将在两个视图中运行委托,因此它可以在多个类中工作,但事实并非如此。 它仅在BViewController.swift中运行

protocol AControllerProtocol {
    func updateGui()
}

class AController {
    func doSomething(){
    // here I get incomming data and other stuff
    // then the gui in multiple views needs an update
    self.delegate.updateGui()
    }

    var delegate: AControllerProtocol
    init(delegate: AControllerProtocol) {
    self.delegate = delegate
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
    super.viewDidLoad()
    acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()
    // works, it runs this method and this tables is inside this BViewController 
    // })
    }
}
class CViewController: AController {
    lazy var acontroller : AController = AController(delegate: self)

    @IBOutlet weak var tracksTableView: UITableView!

    func updateGui() {
        // dispatch_async(dispatch_get_main_queue(), {
        self.tracksTableView!.reloadData()
        // din't run, this table is only in this CViewController
        // it only did run BViewController updateGui()
    // })
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
        super.viewDidLoad()
        acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()

    // get to know how to do this here
    CViewController.tracksTableView!.reloadData()
    // })
    }
}
class CViewController {
    @IBOutlet weak var tracksTableView: UITableView!
}
然后我想,也许这不是正确的方法(将更新推到其他类)

另一个简单的解决方案是这样的

BViewController.swift

protocol AControllerProtocol {
    func updateGui()
}

class AController {
    func doSomething(){
    // here I get incomming data and other stuff
    // then the gui in multiple views needs an update
    self.delegate.updateGui()
    }

    var delegate: AControllerProtocol
    init(delegate: AControllerProtocol) {
    self.delegate = delegate
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
    super.viewDidLoad()
    acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()
    // works, it runs this method and this tables is inside this BViewController 
    // })
    }
}
class CViewController: AController {
    lazy var acontroller : AController = AController(delegate: self)

    @IBOutlet weak var tracksTableView: UITableView!

    func updateGui() {
        // dispatch_async(dispatch_get_main_queue(), {
        self.tracksTableView!.reloadData()
        // din't run, this table is only in this CViewController
        // it only did run BViewController updateGui()
    // })
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
        super.viewDidLoad()
        acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()

    // get to know how to do this here
    CViewController.tracksTableView!.reloadData()
    // })
    }
}
class CViewController {
    @IBOutlet weak var tracksTableView: UITableView!
}
CViewController.swift

protocol AControllerProtocol {
    func updateGui()
}

class AController {
    func doSomething(){
    // here I get incomming data and other stuff
    // then the gui in multiple views needs an update
    self.delegate.updateGui()
    }

    var delegate: AControllerProtocol
    init(delegate: AControllerProtocol) {
    self.delegate = delegate
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
    super.viewDidLoad()
    acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()
    // works, it runs this method and this tables is inside this BViewController 
    // })
    }
}
class CViewController: AController {
    lazy var acontroller : AController = AController(delegate: self)

    @IBOutlet weak var tracksTableView: UITableView!

    func updateGui() {
        // dispatch_async(dispatch_get_main_queue(), {
        self.tracksTableView!.reloadData()
        // din't run, this table is only in this CViewController
        // it only did run BViewController updateGui()
    // })
    }
}
class BViewController: AController {
    @IBOutlet var tableView: UITableView!
    var acontroller : AController?

    override func viewDidLoad() {
        super.viewDidLoad()
        acontroller = AController(delegate: self)
    }

    func updateGui() {
    // dispatch_async(dispatch_get_main_queue(), {
    self.tableView!.reloadData()

    // get to know how to do this here
    CViewController.tracksTableView!.reloadData()
    // })
    }
}
class CViewController {
    @IBOutlet weak var tracksTableView: UITableView!
}
您好,
Martijn

看看NotificationCenter

控制器可以在数据到达时发出通知,并将其发送到通知中心


B和C视图控制器可以侦听该通知,并使用NotificationCenter添加一个观察者。它们的处理程序将在发布通知时触发

这就是我需要的,现在只需要学习如何使用这些东西,哈哈。它们非常简单: