2016-02-20 4 views
0

Я хотел бы назвать функцию, которая закодирована в другом классе.
До сих пор я сделал-структуру на файл structs.swift для моих данных:Вызвать func из другого класса в swift

struct defValues { 
    let defCityName: String 
    let loadImages: Bool 

    init(defCity: String, loadImgs: Bool){ 
     self.defCityName = defCity 
     self.loadImages = loadImgs 
    } 

} 

Я сделал файл Defaults.swift содержащий:

import Foundation 

class DefaultsSet { 

    let cityKey: String = "default_city" 
    let loadKey: String = "load_imgs" 

    func read() -> defValues { 
     let defaults = NSUserDefaults.standardUserDefaults() 
     if let name = defaults.stringForKey(cityKey){ 
      print(name) 
      let valuesToReturn = defValues(defCity: name, loadImgs: true) 
      return valuesToReturn 
     } 
     else { 
      let valuesToReturn = defValues(defCity: "No default city set", loadImgs: true) 
      return valuesToReturn 
     } 
    } 

    func write(city: String, load: Bool){ 
     let def = NSUserDefaults.standardUserDefaults() 
     def.setObject(city, forKey: cityKey) 
     def.setBool(load, forKey: loadKey) 
    } 

} 

, в котором я имеют две функции для чтения, записи для чтения и записи данных с помощью NSUsersDefault соответственно.
На моей основной ViewController я могу прочитать данные с:

let loadeddata: defValues = DefaultsSet().read() 
if loadeddata.defCityName == "No default city set" { 
    defaultCity = "London" 
} 
else { 
    defaultCity = loadeddata.defCityName 
    defaultLoad = loadeddata.loadImages 

} 

Но когда я пытаюсь писать данные, которые он дает мне ошибку. Я использую этот код:

@IBOutlet var settingsTable: UITableView! 
@IBOutlet var defaultCityName: UITextField! 
@IBOutlet var loadImgs: UISwitch! 

var switchState: Bool = true 

@IBAction func switchChanged(sender: UISwitch) { 
    if sender.on{ 
     switchState = true 
     print(switchState) 
    }else { 
     switchState = false 
     print(switchState) 
    } 
} 

@IBAction func saveSettings(sender: UIButton) { 
    DefaultsSet.write(defaultCityName.text, switchState) 
} 
+0

Я просто добавил (а) и работал. Я много раз пробовал, но этого не делал. Мой новый * рабочий * код: '@IBAction func saveSettings (отправитель: UIButton) { DefaultsSet(). Write (defaultCityName.text !, load: switchState) }' – nick

+0

Рад, что вы решили свою собственную проблему. Однако для дальнейшего использования выделите строку ошибки и добавьте сообщение об ошибке. «Это не работает» слишком расплывчато для нас, чтобы помочь вам. –

+0

В Swift имя structs должно быть заглавным, поэтому я переименовал 'defValues' в' DefValues'. Это не критично, но выглядит намного лучше. – Addison

ответ

0

Вам нужен экземпляр DefaultsSet класса

В контроллере представления добавьте эту строку на уровне класса

var setOfDefaults = DefaultsSet() 

Тогда читать

let loadeddata = setOfDefaults.read() 

и напишите

setOfDefaults.write(defaultCityName.text, switchState) 

Имя переменной setOfDefaults предназначено для того, чтобы увидеть разницу.

Или сделайте функцию функции класса и переменную статическим переменным и вызывать функции в классе (без скобок)

+0

Спасибо за ваши комментарии и вашу помощь. Я ценю это. Я новичок в этом мире. @vadian Мне нравится ваше решение. Я собираюсь изменить код :) – nick

+0

Вам действительно нужен экземпляр? Я бы сделал vars и функции static, которые устраняют необходимость в экземпляре. Но в этом случае вам даже нужен класс - я бы просто использовал структуру со статическими методами. – Abizern

+0

@Abizern Я также предпочел бы статический класс или структуру, но я хотел бы предложить решение с наименьшими изменениями кода. – vadian

0

Из кода вы в курсе, что кажется вам необходимо либо сделать метод write метод класса (просто префикс его class), или вам нужно позвонить ему по экземпляру DefaultsSet: DefaultsSet().write(defaultCityName.text, switchState).

Другая проблема, которую я обнаружил, заключается в том, что вам также необходимо развернуть значение textField. Ваш метод write принимает в качестве параметров a String и Bool, но значение defaultCityName.text является необязательным, поэтому String?. Это приводит к ошибке компилятора.

Вы можете попробовать что-то вроде этого: Теперь

@IBAction func saveSettings(sender: UIButton) { 
    guard let text = defaultCityName.text else { 
     // the text is empty - nothing to save 
     return 
    } 

    DefaultsSet.write(text, switchState) 
} 

Этот код компилируется и позволяют вызывать ваш метод.

Сообщите мне, если это поможет вам решить проблему

+0

@catalinaturlea Я использовал это: '@IBAction func saveSettings (отправитель: UIButton) { if defaultCityName.text? .isEmpty == false { let citySaved = defaultCityName.text! setOfDefaults.write (citySaved, load: switchState) defaultCityName.text = "" defaultCityName.placeholder = "Сохранено: \ (citySaved)!" } else { setOfDefaults.write ("Нет настроек по умолчанию для города", load: switchState) defaultCityName.text = "" defaultCityName.placeholder = "Нет настроек по умолчанию!" } } ' – nick

Смежные вопросы