Как сделать чтобы при нажатии Button на всплывающем ViewController поверх корневого View, меняется Image Кнопки корневого View и IBOutlet


#1

Ребят помогите пожалуйста! в моей игре при нажатии на кнопку покупки героя открывается поверх корневого view всплывающее окно для подтверждения покупки как отдельное View. Но при нажатии кнопки (Button) Yes (подтвердить покупку) Не меняется мой IBOutlet и картинка (Image) Button с ошибкой, так как эти атлет и Баттон не инициализированы на этом контроллере соответсвенно. А когда меняю @IBOutlet weak var totalPoint: UILabel! на static var totalPoint: UILabel! игра вылетает при нажатии на кнопку Yes

Код для кнопки подтверждения
@IBAction func yes(_ sender: UIButton) {
self.view.removeFromSuperview()

    YesNoViewController.payTwo = "Pay"
    UserDefaults.standard.set(YesNoViewController.payTwo, forKey: "payTwo")
   

    if YesNoViewController.payTwo == "Pay" {
    pay.setImage(imageAccept, for: .normal)
    GameScene.SubmarinShopAccept2 = 1
    GameScene.coinSum -= level2UnlockValue2
    UserDefaults.standard.set(GameScene.coinSum, forKey: "CoinSum")
    totalCoin -= level2UnlockValue2
    GameScene.self.coinSumLabel.text = "\(GameScene.self.coinSum)"
    totalPoint.text = "\(totalCoin)"
    
    
}

P.s я хочу, чтобы коины при покупке снимались соизмеримо стоимости корабля и кнопка с Image стоимость корабля менялась на image с галочкой


#2

Вам просто надо передать данные, свидетельствующие об успешно покупке, из всплывшего контроллера на предыдущий контроллер. Почитайте про передачу данных между контроллерами здесь на сайте, там всё подробно написано: один (видео - сокращённо), два (текст - подробно).


#3

Cпасибо! Полезные статьи, а как указать подскажите Image для Баттон, то есть как изменить изображение кнопки. Я ранее использовал SetImage
pay.setImage(imageAccept, for: .normal)


#4

так вполне себе можно. Чем вас не устроило?


#5

Возможно с вами в WhatsApp связаться, чтобы подробнее описать проблему? в долгу не останусь! Очень нужна помощь

P.s прошу прощение за наглость, уже неделю сижу над этим ничего в голову не лезет(


#6

Пишите здесь - кому-то потом тоже поможет решение. Ну и я далеко не проффи, есть более опытные коллеги - вам обязательно помогут при конкретной постановке вопроса и проблемы.


#7

Хорошо, проблема в том, что в видео показывают как изменить изображение в UIImage, а мне необходимо изменить изображение UIButton. + Я использую другой метод переход от корневого View к вторичному.

           let YesNoVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "YesNoid") as! YesNoViewController                       
            self.addChild(YesNoVC) 
            YesNoVC.view.frame = self.view.frame  
            self.view.addSubview(YesNoVC.view) 
                       
            YesNoVC.didMove(toParent: self) 

То есть в Сторибоард я не ставлю связь между этими view нежели в видео (PresentModaly), реализую это кодом


#8

Тут не важно как вы переходите от одного контроллера к другому - это всего лишь способ показать контроллер. Данные передаются через делегирование или клоужер. Попробуйте, у вас должно всё получиться. Колужер проще по записи, но сложнее для новичка в понимании. Да и делегирование для новичка тоже может быть проблемой. Если у вас не получиться (именно попробуйте), то воспользуйтесь самым простым способом - это уведомление (Notification). Работа там элементарна: при совершении действия (нажатии кнопки), вы отправляете уведомление с определённым идентификатором. В другом контроллере при инициализации (во viewDidLoad) назначаете наблюдателя за этим идентификатором. При получении уведомления с нужным идентификатором, выполняет какое-то действие - меняете картинку. Но это не самый лучший способ, но зато самый простой для новичка. Но лучше сначала попробуйте делегирование и клоужеры.


#9

Окей, тогда скажите, как действовать в этом случае:

в видео прописывается:

var completion: (String, UIImage?) 

а в функции update:

mainImage.image = image

как быть в этом случае, чтобы прописать image для кнопки именно. вместо UIImage надо указать UIButton? и что писать в функции Update?

моя кнопка:
@IBOutlet weak var pay: UIButton!

Я рассматриваю именно второй способ, который указан в видео


#10

Это то, что передаётся в клоужер (completion - это сам клоужер) - это то, что у вас выполниться (вы получите эти данные) в месте вызова - первом контроллере, куда надо передать данные.
(String, UIImage?) - это кортеж. Переменных может быть сколько угодно и каких угодно типов. Вы можете передать что угодно, хоть просто один параметр Bool - чтобы понять что у вас произошло нажатие или нет. А в месте вызова (в клоужере или в функции делегата) уже методом setImage установите нужную картинку в зависимости от Bool.
Может быть сложно в первый раз понять, посмотрите раз 5-10. В первый раз всегда не слишком понятно. Если всё же будут трудности, то погуглите передачу данных между контроллерами через уведомление - там проще с пониманием. Тут на этом сайте тоже во многих туториала эту тему затрагивают.


#12

Честно говоря, я совсем новичок и у меня не получается это сделать

в первом VC я прописал:

  class LeftRightViewController: UIViewController {
  
  @IBOutlet weak var totalPoint: UILabel!
  
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let selectVC = segue.destination as? YesNoViewController {
        selectVC.compelation = { [weak self] text in
            guard let self = self else {return}
            self.totalPoint.text = text
        }
      }
    }
  }

Во втором VC:

class YesNoViewController: UIViewController {
     var compelation: ((String) -> ())?
     
     @IBOutlet weak var Accept: UIButton!
     private var total2 = "\(GameScene.coinSum - 2)"

     



    @IBAction func yes(_ sender: UIButton) {
    self.view.removeFromSuperview()
    
    compelation?(total2)
    }
}  

P.s я решил пока попробовать без изменения image кнопки, только текст лейбла, но все на том же месте! При нажатии кнопки Yes ничего не меняется. Пожалуйста, помогите!


#13
 @IBAction func yes(_ sender: UIButton) {
    self.view.removeFromSuperview()
    
    compelation?(total2)
    }

А как это вообще может работать?

Я бы сделал так:

 @IBAction func yes(_ sender: UIButton) {
        compelation?(total2)
        
        dismiss(animated: true)
    }

Ну и в compelation устанавливать картинку на кнопку


#14

Спасибо огромное! все получилось, единственное, я бы хотел другую анимацию всплывающего View, как чтоб он не снизу выезжало, а просто появлялось. Как я могу это сделать?


#15

Нужно клацнуть на сегвей в сториборде, и справа выбрать

Present Modally

и

Transition = Cross Dissolve


#16

Круто! Спасибо большое! Последний вопрос: Как сделать, чтобы при выполнение определенного условия, кнопка работала, но не было перехода на другой View, То есть если герой куплен, хочу чтобы кнопка была активной, чтобы можно было изменить ее image при нажатии, но не было перехода. Пробовал:

.isEnabled = false

Но кнопка в этом случае не активна

Заранее благодарен!


#17

Сделай переход при каком то условии


#18

Так я переход делаю в storyboard, без кода, как мне прописать условие?
Я до этого делал переход кодом, но compelation не работал


#19

Тогда придется удалить сегвей и самому в кнопке или создавать контроллер или обрабатывать другое условие.