Хранения константных данных

swift
xcode
ios

#1

Ребят,привет!

У меня есть 2 вопроса, если кто поможет, то буду очень рад :3

Смотрите,

  1. Как лучше всего сделать переход между двумя View. По нажатию кнопки после Alert. Что нужно добавить в код, чтобы после нажатия ОК был переход на другую вьюху. Изначально у меня стоит Modal, и по нажатию на кнопку без alert он переходит.

let alert = UIAlertController(title: “Basket”, message: “Поехали?”, preferredStyle: UIAlertControllerStyle.Alert)
let cancel = UIAlertAction(title: “Отмена”, style: UIAlertActionStyle.Cancel, handler: nil)
let buttonOK = UIAlertAction(title: “OK”, style: UIAlertActionStyle.Default) { (action) -> Void in
// тут код!
}

2). Как можно сохранить константу(инт) одной вьюхи,чтобы она никогда не терялась . Вот,например, была она 1000, открыли приложение, уменьшили на 1. Затем закрыли и там теперь 999.

__
Спасибо!


Alert Controller с переходом в настройки геолокации
#2

upd.
первый вопрос сообразил!

self.performSegueWithIdentifier(“id”, sender: sender)


#3

Добавьте в appdelegate в метод didFinishLaunchingWithOptions:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    
    var count = userDefaults.integerForKey("launchCount")
    if count == 0 {
        count = 1000
    }
    userDefaults.setInteger(count - 1, forKey: "launchCount")
    userDefaults.synchronize()
    
    print(count)
    
    return true
}

#4

Это если сколько раз открылось приложение - если во viewcontroller то:

override func viewDidLoad() {
    super.viewDidLoad()
    let userDefaults = NSUserDefaults.standardUserDefaults()
    
    var count = userDefaults.integerForKey("launchCount")
    if count == 0 {
        count = 1000
    }
    userDefaults.setInteger(count - 1, forKey: "launchCount")
    userDefaults.synchronize()
    
    print(count)
}

#5

Спасибо за ответ!

У меня в app delegate есть только метод
func applicationDidFinishLaunching(application: UIApplication)

В силу неопытности, я не очень понял :slight_smile:
К слову, у меня есть label, который меняет свое значение, мне его надо сохранять.


#6

Можете в applicationDidFinishLaunching:

func applicationDidFinishLaunching(application: UIApplication) {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    
    var count = userDefaults.integerForKey("launchCount")
    if count == 0 {
        count = 1000
    }
    userDefaults.setInteger(count - 1, forKey: "launchCount")
    userDefaults.synchronize()
}

Лейбл:

@IBOutlet weak var label: UILabel! {
  didSet {
    label.text = "\(NSUserDefaults.standardUserDefaults().integerForKey("launchCount"))"
  }
}

#7

Большое спасибо!
Что-то начинает получаться)
По Вашему методу Лейбл всегда при возврате сохраняет значение на единицу меньше установленного.

Попробую упростить задачу себе для понимания.
Вот есть вьюха с лейблом:
@IBOutlet weak var countLabel: UILabel! { didSet { countLabel.text = "\(NSUserDefaults.standardUserDefaults().integerForKey("launchCount"))" } }

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { self.mainCount = self.mainCount - 1 countLabel.text = String(self.mainCount)}
В ней мы по нажатию уменьшаем лейбл на 1. Был он 1000, окей.

Я добавил Ваш код в AppDelegate.
Вот что мне нужно сделать, чтобы сохранял число после всех декременов.

Спасибо!


#8

Тогда лучше убрать все из AppDelegate, а ViewController переделать так:

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    
    var count: Int = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        count = NSUserDefaults.standardUserDefaults().integerForKey("launchCount")
        
        if count == 0 {
            count = 1000
        }
        
        label.text = "\(count)"
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        count -= 1
        label.text = "\(count)"
        let userDefaults = NSUserDefaults.standardUserDefaults()
        userDefaults.setInteger(count, forKey: "launchCount")
        userDefaults.synchronize()
    }
}

#9

Отлично! Спасибо большое, все работает! :blush:

if countAll == 0 {
            countAll = 1000
        }

То если мы дойдем до 0, все сброситься обратно на 1000?
Эту банальную строчку мой мозг отказывается понимать.


#10
NSUserDefaults.standardUserDefaults().integerForKey("launchCount")

Если нет инта с ключом “launchCount” возвращает 0


#11

Спасибо больше, Вы очень помогли :slight_smile:


#12

Привет.
Слушай, у меня получается обновить константу эту, только полным удалением NSUserDefault.
Как можно оперативно изменить эту константу на устройстве, например на 10, 100, … , 10000.

Заранее спасибо за ответ!


#13

И если я хочу хранить уже измененную картинку, то

imageMain.image = UIImage(named: NSUserDefaults.standardUserDefaults().stringForKey("imageCount")!)

<…>

usetDefaultsImage.setObject(imageMain.image, forKey: "imageCount")

то как дальше?

Хотя я сделал глупое условие на счетчик в viewDidLoad() и он все-таки сохраняет правильно.
Спасибо!


#14

Откуда вы берете картинку и как ее изменяете?
У вас массив с именами картинок?


#15

Допустим, 2 картинки лежат у нас в Assets.excassets : дефолтная и nope.jpg

if countAll == 200 {
            countAll -= 1
            self.imageMain.image = UIImage(named: "nope.jpg")
        } else if countAll == 0 {
            finalBut.hidden = false
            countLabel.text = "Ура! Котик!"
        } else {
            countAll -= 1
            countLabel.text = "\(countAll)"
}

Но при перезапуске все равно ставится опять дефолтная. Я решил эту проблемы обычным условием в viewDidLoad() : если наша константа меньше какого-то числа, то меняем картинку.

upd. Вопрос со сменой константы,не знаете? :slight_smile:

Спасибо!


#16

Я все знаю, просто не могу понять что вы пытаетесь сделать)
Особенно вот это:

Какое отношение count имеет к именам картинок.

Нужно при определенном индексе показывать определенную картинку и этот индекс менять?


#17

Это два разных вопроса :smiley:

C формулированием мыслей у меня точно проблемы) Итак, с одним я разобрался сам :smiley:

Вопрос не относиться к картинкам про константы!
Мы помним, что у нас есть Label. Он декрементится, и он константный - NSUserDefault.

Вопрос в том, как можно снова обновить эту константу на устройстве?


#18

Вот в этом мой вопрос. Как обновить эту константу.


#19

Когда вы жмете на экран count становиться меньше на единицу:

count -= 1

Вы можете присвоить любое значение:

count = 666
label.text = "(count)"
let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setInteger(count, forKey: "launchCount")
userDefaults.synchronize()

#20

Это-то понятно. Он изменится на 666.

Допустим. Раньше счетчик стоял на 256.
Мы поставили ему 666. При запуске он станет 666, но когда мы сделаем тач,то он будет (256 - 1)= 255.