Вызовите делегата без segues или фактически добавив представление на раскадровку

Я новичок в Swift, и я запутался, как передать значения из контейнера в родительское представление. Я попробовал метод делегата, но я не знаю, как вызвать метод делегата внутри родителя. Кажется, он не работает, приложение просто завершается.

Следующий код показывает, как отображать контейнер. CameraView - это представление контейнера, а DiaryEntryViewController - это родительский контроллер представления.

@IBAction func cameraBtn(_ sender: Any) {
    CameraView.isHidden = !CameraView.isHidden
    self.view.sendSubview(toBack: diaryEntryText) 
}

И при нажатии другой кнопки контейнер должен скрывать и одновременно передавать данные в родительское представление. Я могу скрыть представление с помощью следующего кода:

@IBAction func saveCamBtn(_ sender: Any) {
  let parent = self.parent as! DiaryEntryViewController
  parent.CameraView.isHidden  = true
}

Есть ли способ получить данные для родительского представления. На самом деле я не хочу использовать сегменты, так как данные внутри представления не должны быть потеряны, если я снова открою контейнерное представление.

1 ответ

Here is an example, the Player class delegates the shooting logic to the weapon:

protocol Targetable {
    var life: Int { get set }
    func takeDamage(damage: Int)
}

protocol Shootable {
    func shoot(target: Targetable)
}

class Pistol: Shootable {
    func shoot(target: Targetable) {
        target.takeDamage(1)
    }
}

class Shotgun: Shootable {
    func shoot(target: Targetable) {
        target.takeDamage(5)
    }
}

class Enemy: Targetable {
    var life: Int = 10

    func takeDamage(damage: Int) {
        life -= damage
        println("enemy lost \(damage) hit points")

        if life <= 0 {
            println("enemy is dead now")
        }
    }
}

class Player {
    var weapon: Shootable!

    init(weapon: Shootable) {
        self.weapon = weapon
    }

    func shoot(target: Targetable) {
        weapon.shoot(target)
    }
}

var terminator = Player(weapon: Pistol())

var enemy = Enemy()

terminator.shoot(enemy)
//> enemy lost 1 hit points
terminator.shoot(enemy)
//> enemy lost 1 hit points
terminator.shoot(enemy)
//> enemy lost 1 hit points
terminator.shoot(enemy)
//> enemy lost 1 hit points
terminator.shoot(enemy)
//> enemy lost 1 hit points

// changing weapon because the pistol is inefficient
terminator.weapon = Shotgun()

terminator.shoot(enemy)
//> enemy lost 5 hit points
//> enemy is dead now

Кроме того, вы можете обратиться по этой ссылке: https://medium.com/@jamesrochabrun/implementing-delegates-in-swift-step-by-step-d3211cbac3ef

Другие вопросы по тегам