Как subViewA изменить параметр на subviewB? - PullRequest
0 голосов
/ 23 октября 2018

Я создал два представления в Main.storyboard с

class ViewController: UIViewController 
{
   var cardsOnTableCounts = 0
   @IBOutlet weak var headStackView: HeadStackView!
   @IBOutlet weak var gridCardView: GridView!

   @objc func touchDeal3Card () 
   {
    gridCardView.cellCounts += 3
   }
} 

Я создал кнопку в классе HeadStackView

class HeadStackView: UIView 
{
  var deal3Card: UIButton = UIButton.init()

  override func draw(_ rect: CGRect) {
    setDeal3Card()
  }

  private func setDeal3Card () {
    let leftButtonFrame : CGRect = CGRect(x: bounds.maxX/15, y: bounds.maxY/6, width: bounds.maxX/3, height: bounds.maxY*0.7)
    deal3Card = UIButton.init(frame: leftButtonFrame)
    deal3Card.backgroundColor = UIColor.purple
    deal3Card.setTitle("Deal 3 Cards", for: .normal)
    deal3Card.addTarget(self, action: #selector(ViewController.touchDeal3Card), for: .touchUpInside)
    addSubview(deal3Card)
}

В GridView.swift

class GridView: UIView 
{
  var cellCount: Int = 5 {didSet { setNeedsDisplay(); setNeedsLayout()}}

  override func layoutSubviews() {
    super.layoutSubviews()
    drawGrid() // it draws cellCount of cells
  }
}      

Моя цель - когда нажата UIButton deal3Card, gridCardView перерисовает себя с большим количеством карт в gridCardView.

Код выше передан компилятору и покажет кнопку (deal3card).но когда я нажимаю на кнопку, появляется исключение:

2018-10-23 19: 52: 54.283032 + 0200 gridTest [23636: 5175258] - [gridTest.HeadStackView touchDeal3Card]: нераспознанный селектор отправленэкземпляр 0x7fb97180c8f0

2018-10-23 19: 52: 54.287469 + 0200 gridTest [23636: 5175258] *** Завершение работы приложения из-за невыполненного исключения «NSInvalidArgumentException», причина: '- [gridTest.HeadStackView touchDealC]:нераспознанный селектор отправлен на экземпляр 0x7fb97180c8f0 '

1 Ответ

0 голосов
/ 23 октября 2018

Непосредственной причиной сбоя является следующая строка:

deal3Card.addTarget(self, 
    action: #selector(ViewController.touchDeal3Card), for: .touchUpInside)

Цель self неверна.Вы хотите отправить это сообщение контроллеру представления, который реализует touchDeal3Card.Но в вашем коде self - это кнопка, которой нет.

Самое простое решение, учитывая построенную вами архитектуру, - заменить self на nil.Это заставит touchDeal3Card просочиться вверх по цепочке респондента и добраться до контроллера представления.


Сказав , что , я бы предположил, что сама архитектура неверна.Контроллер представления должен контролировать представления;взгляды не должны контролировать себя.Контроллер вида, а не вид, должен создавать кнопку.Это хорошо подтверждается тем фактом, что этот код является абсолютно неправильным:

override func draw(_ rect: CGRect) {
    setDeal3Card()
}

Это полное неправильное использование draw и может привести к ужасным неприятностям.Единственное, что вы должны сделать в draw - это подождать.Добавление подпредставлений в draw настолько неправильно, насколько это возможно.

...