При разработке iOS с использованием Swift обычно требуется вызвать метод в одном контроллере представления из другого контроллера представления при нажатии кнопки. В этой статье будут рассмотрены различные методы достижения этой функциональности, а также приведены примеры кода.
Метод 1: использование делегирования
Делегирование — это шаблон проектирования, который позволяет одному объекту взаимодействовать с другим объектом и управлять им. Чтобы вызвать метод в другом контроллере представления с помощью делегирования, выполните следующие действия:
- Создайте протокол в первом контроллере представления, который определяет вызываемый метод.
- Реализуйте протокол во втором контроллере представления и определите метод.
- Установите первый контроллер представления в качестве делегата второго контроллера представления.
- Вызов метода из действия кнопки во втором контроллере представления.
Пример кода для первого контроллера представления:
protocol SecondViewControllerDelegate: class {
func buttonClicked()
}
class FirstViewController: UIViewController, SecondViewControllerDelegate {
// ...
func buttonClicked() {
// Method implementation
}
// ...
func presentSecondViewController() {
let secondViewController = SecondViewController()
secondViewController.delegate = self
present(secondViewController, animated: true, completion: nil)
}
}
Пример кода для второго контроллера представления:
class SecondViewController: UIViewController {
weak var delegate: SecondViewControllerDelegate?
// ...
@IBAction func buttonAction(_ sender: UIButton) {
delegate?.buttonClicked()
}
}
Метод 2: использование уведомлений
Уведомления – это способ распространения информации по вашему приложению. Чтобы вызвать метод в другом контроллере представления с помощью уведомлений, выполните следующие действия:
- Определите имя уведомления в первом контроллере представления.
- Добавьте наблюдателя для уведомления во втором контроллере представления и определите вызываемый метод.
- Опубликовать уведомление о действии кнопки во втором контроллере представления.
Пример кода для первого контроллера представления:
extension Notification.Name {
static let buttonClickedNotification = Notification.Name("ButtonClickedNotification")
}
class FirstViewController: UIViewController {
// ...
func presentSecondViewController() {
let secondViewController = SecondViewController()
present(secondViewController, animated: true, completion: nil)
}
// ...
func buttonClicked() {
// Method implementation
}
}
Пример кода для второго контроллера представления:
class SecondViewController: UIViewController {
// ...
@IBAction func buttonAction(_ sender: UIButton) {
NotificationCenter.default.post(name: .buttonClickedNotification, object: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(buttonClicked), name: .buttonClickedNotification, object: nil)
}
@objc func buttonClicked() {
// Method implementation
}
}
Метод 3: использование переходов и подготовка к переходу
Если вы используете переходы для навигации между контроллерами представления, вы можете вызвать метод в целевом контроллере представления, используя метод prepare(for:sender:). Выполните следующие действия:
- Создайте переход между двумя контроллерами представления в Interface Builder.
- Реализуйте метод
prepare(for:sender:)в первом контроллере представления. - Проверьте тип целевого контроллера представления и вызовите метод.
Пример кода для первого контроллера представления:
class FirstViewController: UIViewController {
// ...
func presentSecondViewController() {
performSegue(withIdentifier: "SecondViewControllerSegue", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let secondViewController = segue.destination as? SecondViewController {
secondViewController.buttonClicked()
}
}
}
Пример кода для второго контроллера представления:
class SecondViewController: UIViewController {
// ...
func buttonClicked() {
// Method implementation
}
}
Метод 4: использование обратных вызовов закрытия
Вы можете передать закрытие в качестве обратного вызова при представлении второго контроллера представления и вызвать его из действия кнопки. Выполните следующие действия:
- Определите тип замыкания во втором контроллере представления, который соответствует сигнатуре метода.
- Добавьте свойство для хранения замыкания во втором контроллере представления.
- Вызов замыкания с помощью действия кнопки.
Пример кода для первого контроллера представления:
class FirstViewController: UIViewController {
// ...
func presentSecondViewController() {
let secondViewController = SecondViewController()
secondViewController.buttonClickedCallback = buttonClicked
present(secondViewController, animated: true, completion: nil)
}
func buttonClicked() {
// Method implementation
}
}
Пример кода для второго контроллера представления:
class SecondViewController: UIViewController {
var buttonClickedCallback: (() -> Void)?
// ...
@IBAction func buttonAction(_ sender: UIButton) {
buttonClickedCallback?()
}
}
Метод 5: использование синглтона
Синглетон — это класс, который позволяет создавать только один экземпляр и предоставляет глобальную точку доступа к нему. Вы можете создать одноэлементный класс для хранения общих данных и методов, включая вызываемый метод. Выполните следующие действия:
- Создайте одноэлементный класс с вызываемым методом.
- Доступ к экземпляру синглтона из обоих контроллеров представления и вызов метода.
Пример кода для класса Singleton:
class MySingleton {
static let shared = MySingleton()
private init() {}
func buttonClicked() {
// Method implementation
}
}
Пример кода для первого контроллера представления:
class FirstViewController: UIViewController {
// ...
func presentSecondViewController() {
let secondViewController = SecondViewController()
present(secondViewController, animated: true, completion: nil)
}
func buttonClicked() {
MySingleton.shared.buttonClicked()
}
}
Пример кода для второго контроллера представления:
class SecondViewController: UIViewController {
// ...
@IBAction func buttonAction(_ sender: UIButton) {
MySingleton.shared.buttonClicked()
}
}
Метод 6: использование внедрения зависимостей
Внедрение зависимостей — это метод, при котором зависимости предоставляются извне, а не создаются внутри. Вы можете передать ссылку на первый контроллер представления второму контроллеру представления и напрямую вызвать его метод. Выполните следующие действия:
- Добавьте свойство для хранения ссылки на первый контроллер представления во втором контроллере представления.
- Назначьте ссылку при представлении второго контроллера представления.
- Вызов метода по ссылке.
Пример кода для первого контроллера представления:
class FirstViewController: UIViewController {
// ...
func presentSecondViewController() {
let secondViewController = SecondViewController()
secondViewController.firstViewController = self
present(secondViewController, animated: true, completion: nil)
}
func buttonClicked() {
// Method implementation
}
}
Пример кода для второго контроллера представления:
class SecondViewController: UIViewController {
weak var firstViewController: FirstViewController?
// ...
@IBAction func buttonAction(_ sender: UIButton) {
firstViewController?.buttonClicked()
}
}
Метод 7: использование наблюдения за ключом и значением (KVO)
KVO позволяет объектам уведомляться об изменениях определенных свойств другого объекта. Вы можете наблюдать за свойством в первом контроллере представления из второго контроллера представления и вызывать метод при изменении свойства. Выполните следующие действия:
- Добавьте наблюдаемое свойство в первый контроллер представления.
- Добавьте наблюдателя для свойства во втором контроллере представления и определите вызываемый метод.
- Запускать вызов метода при изменении свойства.
Пример кода для первого контроллера представления:
class FirstViewController: UIViewController {
@objc dynamic var buttonClicked = false
// ...
func presentSecondViewController() {
let secondViewController = SecondViewController()
addObserver(secondViewController, forKeyPath: #keyPath(buttonClicked), options: [.new], context: nil)
present(secondViewController, animated: true, completion: nil)
}
func buttonClicked() {
// Method implementation
}
}
Пример кода для второго контроллера представления:
class SecondViewController: UIViewController {
// ...
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == #keyPath(FirstViewController.buttonClicked) {
if let newValue = change?[.newKey] as? Bool, newValue {
buttonClicked()
}
}
}
func buttonClicked() {
// Method implementation
}
}
В этой статье мы рассмотрели семь различных методов вызова другого метода контроллера представления при нажатии кнопки из другого контроллера представления iOS Swift. Эти методы включают делегирование, уведомления, переходы, обратные вызовы закрытия, синглтоны, внедрение зависимостей и наблюдение за значением ключа. Каждый метод предлагает свой подход к достижению желаемой функциональности, и выбор зависит от конкретных требований вашего проекта.