Триггер UIAlertViewController на основе времени - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть UITable для отображения разных животных.Когда вы выбираете ячейку в таблице, выдвигается новый контроллер представления с большим UIImage.В настоящее время, когда вы увеличиваете изображение, запускается UIAlertView, который спрашивает пользователя, хотят ли они загрузить изображения высокого разрешения.Если они нажимают «да», «hi-res-flag» устанавливается в «yes» в пользовательских значениях по умолчанию, и они больше не видят всплывающее окно.Однако, если они выберут «нет», флаг hi-res будет продолжать появляться каждый раз, когда они увеличивают фотографию.

Вместо этого, если они ответят нет, я бы хотел, чтобы этот флаг всплывал изредка .Не каждый раз, когда щелкают ячейку в таблице видов, и не каждый раз, когда они открывают приложение.Что-то больше, как один или два раза в месяц.Есть ли способ использовать время в логике приложения для iOS?Например, стирать значение, установленное для «флага высокого разрешения» (если оно уже равно «нет») в пользовательских значениях по умолчанию, один раз в месяц?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Ответ TheEye's - хорошее решение.Я просто хочу внести этот метод с точки зрения кода.Не стесняйтесь использовать его, чтобы получить функциональность проверки времени.Пожалуйста, потерпите, потому что это Свифт.Вы также можете использовать его из своего кода Objective-C.Вы можете найти этот код в gist здесь .

Решение

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

class ImageViewController: UIViewController {

    //Whenever you enter the Image View Controller, you check whether to show popup or not
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        if let hiResFlag = hiResFlag {
            if hiResFlag == false {
                if PopUpTimeChecker.shouldShowPopUp() {
                    self.presentAlert()
                }
            }
        }
    }

    func presentAlert() {
        let alert = UIAlertController.init(title: nil, message: "Show Pop up", preferredStyle: .alert)
        let action = UIAlertAction.init(title: "Yeahh!", style: .default, handler: nil)

        alert.addAction(action)

        self.present(alert, animated: true, completion: nil)
    }

}

В следующем коде реализован алгоритм проверки времени.Отредактируйте popUpTimeInterval ниже для установки минимального времени.Прямо сейчас это установлено на 15 дней (в секундах).Раз в 15 дней всплывающее окно будет отображаться при вызове метода shouldShowPopUp.

import UIKit

//Below 4 variables, I have made them Global. No need to make them global in your case

var popUpTimeInterval: UInt64 = 1296000 //15 days in seconds

var hiResFlag: Bool? {
    get {
        return UserDefaults.standard.object(forKey: "HiResFlag") as? Bool
    }
    set {
        UserDefaults.standard.setValue(newValue, forKey: "HiResFlag")
    }
}

var isFirstTimePopUp: Bool {
    get {
        let value = UserDefaults.standard.object(forKey: "IsFirstTimePopUp")
        return value == nil ? true : value as! Bool
    }
    set {
        UserDefaults.standard.setValue(newValue, forKey: "IsFirstTimePopUp")
    }
}

var lastDateOfPopUp: Date? {
    get {
        return UserDefaults.standard.object(forKey: "LastDateOfPopUp") as? Date
    }
    set {
        UserDefaults.standard.setValue(newValue, forKey: "LastDateOfPopUp")
    }
}


class PopUpTimeChecker {

    static fileprivate func setLastPopUpDate() {
        //Setting current date to last shown pop up date
        lastDateOfPopUp = Date()
    }

    static fileprivate func timeIntervalSinceLastPopUp() -> UInt64 {
        //Returning how much time (in seconds) has passed from last popup date until now
        return UInt64(Date().timeIntervalSince(lastDateOfPopUp!))
    }

    static func shouldShowPopUp() -> Bool {
        //We proceed further only if we have the last date when pop up was displayed, else we create and set it as the current date
        if let _ = lastDateOfPopUp {
            let timeInterval = timeIntervalSinceLastPopUp()
            if timeInterval > popUpTimeInterval {
                self.setLastPopUpDate()
                return true //Show pop up
            } else {
                if isFirstTimePopUp {
                    //If this is the first time, you just allow the pop up to show, don't allow otherwise
                    isFirstTimePopUp = false
                    return true
                } else {
                    return false
                }
            }
        } else {
            self.setLastPopUpDate() //Since we don't have a last date, we set it here for starting off
            return self.shouldShowPopUp() //Recursively call method
        }
    }
}
0 голосов
/ 25 апреля 2018

Сохраните время, в которое вы показывали предупреждение последним, в настройках пользователя, а затем проверяйте это значение каждый раз, прежде чем представлять предупреждение, если определенное время прошло.

...