Невозможно вызвать другой метод класса, используя делегат в swift - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь вызвать метод класса B из класса A для события нажатия кнопки.Но он не работает и ниже мой код.

// Viewcontroller
class ViewController: UIViewController {
   @IBAction func btnClicked(_ sender: Any) {
        var objA = A()
        objA.delegate?.TestA()
    }
}

// ClassA.swift
protocol TestA {
    func TestA()
}

class A {
    var delegate: TestA?
}


// ClassB.swift
class B : TestA {
    func TestA() {
        print(" Function A from b")
    }
}

При нажатии кнопки функция TestA () не вызывается.

Я даже попробовал приведенный ниже код, но он также нене работает:

var objB = B()
var objA = A()
objA.delegate = objB

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Объект objA.delegate никогда не назначается объекту, поэтому он имеет начальное значение nil.?оператор избегает вызова функции для нулевого объекта.

0 голосов
/ 14 февраля 2019

Ответ Сандип Бхандари правильный.

Некоторая информация для лучшего понимания Протокола и делегатов.TestA - это protocol, а необязательный var delegate определен в class A.Эта настройка правильная.Идея этой настройки заключается в том, что любой пользователь class A, в данном случае class B, который соответствует protocol TestA, получает обратный вызов от class A.Вам необходимо вызвать функцию delegate.testA() из class A.Нынешняя реализация ViewController совсем не выигрывает от определения протокола и делегатов.

Для правильного использования кабина class A должна быть модифицирована следующим образом:

protocol TestA {
    func testA()
}

class A {
        var delegate: TestA?
        func process() {
            // Do something and call delegate function to report it.
            delegate?.testA()
        }
    }

И изменить ViewController следующим образом (скопировано class B для полноты):

class ViewController: UIViewController {
    @IBAction func btnClicked(_ sender: Any) {
        var objA = A()
        var objB = B()
        objA.delegate = objB
        objA.process()
    }
}

// ClassB.swift
class B : TestA {

    func TestA() {
        print(" Function A from b")
    }
}

Теперь функция, реализованная в class B для соответствия protocol TestA, будет вызываться при вызове функции process() для objA из class A.Это лучше использовать протокол и делегат.Надеюсь, это поможет.

0 голосов
/ 13 февраля 2019

Поскольку вы создаете экземпляр класса A, используя

    var objA = A()

Очевидно, что вы не инициализировали свойство delegate в A, поскольку его необязательное значение по умолчанию равно nil

Теперь, когдаВы вызываете

    objA.delegate?.TestA()

делегат равен нулю, поэтому функция TestA не будет вызываться

Предложение

Всегда используйте camelCasing для объявления имен функций.Так что TestA() неверно, скорее используйте testA()

РЕДАКТИРОВАТЬ 1:

Проверено это

@IBAction func btnClicked(_ sender: Any) {
    let objA = A()
    let objB = B()
    objA.delegate = objB
    objA.delegate?.TestA()
}

Это работает нормально, что являетсявопрос

...