Использование addTarget (target: action :) без self - PullRequest
0 голосов
/ 25 сентября 2018

Есть ли способ использовать addTarget для чего-то, кроме себя (что кажется наиболее распространенным вариантом использования)?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы, конечно, можете настроить какой-то другой объект для получения управляющих действий.Рассмотрим следующий контроллер представления:

Сначала определите класс, чья работа заключается в том, чтобы реагировать на действия нажатия кнопки:

@objc class ButtonTarget: NSObject {
    @IBAction func buttonAction(_ sender: Any) {
        print("In \(#function)")
    }
}

Теперь определите контроллер представления, который создает ButtonTarget объект

class ViewController: UIViewController {

    @IBOutlet weak var button: UIButton!

    lazy var buttonTarget = ButtonTarget() //Give the ViewController a `ButtonTarget`

    override func viewDidLoad() {
        super.viewDidLoad()

        //Add a taret/action to the button that invokes the method `buttonAction(_:)`
        button.addTarget(
          buttonTarget, 
          action: #selector(ButtonTarget.buttonAction(_:)), 
          for: .touchUpInside)
    }
}
0 голосов
/ 25 сентября 2018

Да, вы можете использовать цель, отличную от self.Наиболее распространенное использование - это вызов addTarget с self, где self является ссылкой на viewController, который добавляет UIControl к своей иерархии представления.Но вы не обязаны использовать это таким образом.target - это просто ссылка на объект, поэтому вы можете передать ему ссылку на любой объект, который вы хотите.action - это Selector, который должен быть определен как метод экземпляра для class этого объекта, и этот метод должен быть доступен Objective-C (отмечен @objc или @IBAction), и ондолжны принимать либо параметры, либо sender, либо sender и event.

. Вы также можете передать nil в качестве цели, что говорит iOS о поиске цепочки респондента для поискаaction метод.


Вот небольшой автономный пример:

import UIKit

class Foo {
    @objc func buttonClicked() {
        print("clicked")
    }
}

class ViewController: UIViewController {

    let foo = Foo()

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(frame: CGRect(x: 50, y: 200, width: 100, height: 30))
        button.setTitle("Press me", for: .normal)
        button.setTitleColor(.blue, for: .normal)
        button.addTarget(foo, action: #selector(Foo.buttonClicked), for: .touchUpInside)
        self.view.addSubview(button)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...