Задание 23-го урока UIKit

uikit
swift
ios

#1

Здравствуйте

Прошу помочь с решением, следующего задания.

Задание звучит, следующим образом:
Необходимо реализавать метод PageViewController с куском кода:

let userDefaults = UserDefaults.standard
userDefaults.set(true, forKey: "presentationWasViewed")
dismiss(animated: true, completion: nil)

В ContentViewController.swift создается экземляр PageViewController и после обращаемся через этот экземпляр к функции, которая выполняет данный блок кода, после выполнения которого ViewController закрывается.

Где можно посмотреть, как правильно создавать экземпляры, которые обращаются к функции в рамках работы button?

   @IBAction func skipButton(_ sender: UIButton) {

Заранее спасибо.


ДЗ с урока - 23. UIPageViewController: Part 4
#2

Добрый день!

Подсветку кода используйте пожалуйста.


#4

Здравствуйте

Нужно объявить новый метод например:

func setPresentationStatusToDone() {
    let userDefaults = UserDefaults.standard
    userDefaults.set(true, forKey: "presentationWasViewed")
    dismiss(animated: true, completion: nil)
}

И затем вызвать этот метод из вашего экшина skipButton через экземпляр класса pageViewController:

@IBAction func skipButton(_ sender: UIButton) {
    let pageVC = PageViewController()
    pageVC.setPresentationStatusToDone()
}

#5

Сейчас не за компьютером.
Я все понял.
Спасибо Вам большое.


#6

Без кнопки, презентация закрывается.

Может быть здесь где-то ошибка?

Посмотрите пожалуйста.

import UIKit

class ContentViewController: UIViewController {

@IBOutlet weak var presentTextLabel: UILabel!
@IBOutlet weak var emojiLabel: UILabel!
@IBOutlet weak var pageControl: UIPageControl!
@IBOutlet weak var hiddenButtom: UIButton!


var presentText = ""
var emoji = ""
var numberOfPages = 0
var currentPage = 0


override func viewDidLoad() {
    super.viewDidLoad()
    
    presentTextLabel.text = presentText
    emojiLabel.text = emoji
    pageControl.numberOfPages = numberOfPages
    pageControl.currentPage = currentPage
    
    hiddenButtom.isHidden = true
    if currentPage == 3 {
        hiddenButtom.isHidden = false
    } else {
        hiddenButtom.isHidden = true
    }
}


@IBAction func skipBut(_ sender: UIButton) {
    let pageViewController = PageViewController()
    pageViewController.setPresentationStatusToDone()
}

}


#7
  1. В классе PageViewController и в методе showViewControllerAtIndex из второго гарда удаляете весь код из ветки else, кроме return nil. Должно быть так:

    guard index < presentScreenContents.count else { return nil }
    
  2. Идете в класс ContentPageViewController и в методе экшина прописываете следующее:

    @IBAction func skipButton(_ sender: Any) {
         let userDefaults = UserDefaults.standard
         userDefaults.set(true, forKey: "presentationWasViewed")
         dismiss(animated: true, completion: nil)
    }
    

Создавать метод setPresentationStatusToDone не надо. Главное очистить гард.

P.S. Обратите внимание на то, что бы название ключа было одинаковым как в классе ContentPageViewController так и в классе ViewController, т.е. и там и там должно быть “presentationWasViewed”


#8

Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура! Ура!


#9

А почему все таки не работает вызов функции через экземпляр класса PageViewController? с чем это может быть связано


#10

Тоже интересно, Вы так и не нашли решения?


#11

А почему все таки не работает вызов функции через экземпляр класса PageViewController ? с чем это может быть связано


#12

Вызов работает, но не работает dismiss. Надо посмотреть документацию:

dismiss(animated:completion:)
Dismisses the view controller that was presented modally by the view controller.

Вызов dismiss на экземпляре PageViewController ни к чему не приводит, поскольку, во-первых, этот экземпляр не был добавлен модально на другой экран. Он просто был создан строкой выше. Во-вторых, даже если бы он был бы добавлен, то он не смог бы, вызывая dismiss у себя, скрыть ContentPageViewController, который является его родителем.

Поэтому решением стало вызывать dismiss на самом ContentPageViewController.