2014-12-01 3 views
3

Я довольно новичок в Swift, и у меня возникла проблема с многоэкранным отображением TableView. У меня есть несколько вариантов, которые я могу проверить с помощью галочки, аналогично списку дел.Swift - Сохранить флажки, выбранные в TableView

Когда я проверяю элементы, я хочу, чтобы вернуться в ListView и сохранить мои варианты. Я предполагаю, что код, чтобы сохранить это в сохраненном состоянии, будет куда-то здесь? Это класс, где записан индивидуальный галочка элемент ячейки:

class ListItem: NSObject { 
    let itemName: String 
    var completed: Bool 

    init(itemName: String, completed: Bool = false) 
    { 
     self.itemName = itemName 
     self.completed = completed 
    } 
} 

Может кто-то пожалуйста, покажите мне, как идти об этом?

Это cellForRowAtIndexPath

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let tempCell = tableView.dequeueReusableCellWithIdentifier("ListPrototypeCell") as UITableViewCell 
    let listItem = listItems[indexPath.row] 

    // Downcast from UILabel? to UILabel 
    let cell = tempCell.textLabel as UILabel! 
    cell.text = listItem.itemName 

    if (listItem.completed) 
    { 
     tempCell.accessoryType = UITableViewCellAccessoryType.Checkmark; 
    } 
    else 
    { 
     tempCell.accessoryType = UITableViewCellAccessoryType.None; 
    } 

    return tempCell 
}  

и мой didSelectRowAtIndexPath

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    tableView.deselectRowAtIndexPath(indexPath, animated: false) 

    let tappedItem = listItems[indexPath.row] as ListItem 
    tappedItem.completed = !tappedItem.completed 

    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None) 

}  
+0

Когда вы говорите, «спасенных», что вы имеете в виду? Вам нужны ваши выборы для продолжения между открытием приложения? Вы освободите диспетчер представлений, содержащий представление таблицы, и вам нужно будет воссоздать его содержимое? –

+0

Как вы храните общие данные? Состояние завершения должно быть сохранено, а затем проверить при отображении таблицы о том, следует ли ее проверять или нет. –

+0

Привет, Линдси. Я хочу, чтобы я хотел выбрать элемент и увидеть свою галочку, когда вернусь к представлению таблицы. Что касается освобождения диспетчера представлений и воссоздания его содержимого, я буду использовать табличное представление только для одной части приложения, поэтому мне не нужно повторно использовать какой-либо его контент. Имеет ли это смысл? –

ответ

0

Я полагаю, у вас есть массив ListItem, представляющий данные модели (содержание в виде таблицы). Затем, чтобы сохранить это за пределами рабочего приложения, вы можете сохранить его в NSUserDefaults или в файл. Для этого вам понадобится способ сериализации ListItem. Обычный способ сделать это - использовать ListItem протокол NSCoding и реализовать encodeWithCoder: и init(coder:) для использования NSKeyedArchiver и NSKeyedUnarchiver («кодер» в этих методах), чтобы превратить объект ListItem в NSData и наоборот. После того, как вы это сделали, массив ListItem может быть непосредственно сериализован с помощью NSKeyedArchiver и NSKeyedUnarchiver.

+0

Вот пример простого объекта Person - не очень отличается от вашего объекта ListItem: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch23p798basicFileOperations/ch36p1053basicFileOperations/Person.swift – matt

+0

Привет, Matt , Я не уверен, как назвать это в формате массива. Это, как принять это? Это то, что я для encodeWithCoder: 'необходимый Init (кодировщик aDecoder: NSCoder) { super.init (кодировщик: aDecoder) }' –

+0

@NatashaJulain Вы сказали, что вам не нужно сохранять данные вне приложения (т. е. между запусками приложений), поэтому это не нужно. –

1

Две вещи:

Ваш код в cellForRowAtIndexPath: совершенен. Для заполнения текста и галочки вашей ячейки требуется информация от listItems[indexPath.row]. Но в вашем didSelectRowAtIndexPath: вы никогда не меняете listItems, так что cellForRowAtIndexPath: имеет обновленные данные, из которых можно вытащить новую строку при перезагрузке. Поэтому вместо использования deselectRowAtIndexPath: просто обновите массив listItems, затем reloadRowsAtIndexPaths. (Честно говоря, я запутался, почему это работает для вас до этого момента, так как вы звонили перезарядку на данных ООН обновляемый.) Вот что я рекомендую:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

    let tappedItem = listItems[indexPath.row] as ListItem 
    tappedItem.completed = !tappedItem.completed 

    // Store the updated tappedItem back at the listItems index 
    listItems[indexPath.row] = tappedItem 

    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None) 

} 

Во-вторых, до тех пор, как этот массив хранится в контроллере представления, который не освобождается, вы не потеряете эти данные, и вы сможете повторно заполнить таблицу. Но если он хранится в контроллере представления (или контроллере табличного представления), который освобождается, вы можете захотеть сохранить его в другом месте в своей программе.

+0

Доброе утро :) Я обновил свой код с того, что вы предложили. Убрал сборку, запустил код, но не сделал того, что хотел. :(Элементы, которые я выбрал, еще не отменены. –

+0

@NatashaJulain Я подозреваю, что это имеет какое-то отношение к тому факту, что перезагрузка никогда не работала для вас в первую очередь ...Как я уже сказал, «я в замешательстве, почему он работал для вас до этого момента, так как вы вызывали перезагрузку по не обновленным данным». Первоначально ваша таблица полагалась на 'deselectRowAtIndexPath:' для внесения изменений. Я собираюсь обдумать это и немного вернуться к вам ... Но просто любопытно ... Что происходит, когда вы заменяете 'tableView.reloadRowsAtIndexPaths (...' на 'tableView.reloadData()'? работаете? –

+0

Я решил это! Я отправил свой ответ :) Однако, используя 'NSUserDefaults':/Вы можете взглянуть на то, что я сделал. Спасибо за ваше драгоценное время, чтобы помочь. –

0

решаемые это смешивание и соответствие немного, используя NSUserDefaults Вот он идет:

создания кнопки в панели навигации моего поп-за стола/ListView и функциональности к кнопке:

//create a done button in the navigation bar 
    var done = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: Selector("doneBtn")) 
    self.navigationItem.rightBarButtonItem = done 

} 

//This is the "Done" button functionality 

func doneBtn() 
{ 

    var saveString = "" 

    for var i=0; i<listItems.count; i++ 
    { 
     let listItem = listItems[i] 
     if (listItem.completed) 
     { 
      saveString = saveString + " " + "\(i)" 
     } 
    } 

    saveString = saveString.stringByTrimmingCharactersInSet(NSCharacterSet .whitespaceAndNewlineCharacterSet()) 

    NSUserDefaults.standardUserDefaults().setValue(saveString, forKey: "savedValues") 
    NSUserDefaults.standardUserDefaults().synchronize() 


    self.navigationController?.dismissViewControllerAnimated(true, completion: nil) 


    } 

Тогда в моей FUNC для загрузки исходного массива данных, который содержит мои элементы списка, создал переменную savedValues, которая выглядит следующим образом:

var savedValues : String? = NSUserDefaults.standardUserDefaults().valueForKey("savedValues") as? String 



    if(!(savedValues==nil)) 
    { 
     var nsStr: NSString = savedValues! 
     let array = nsStr.componentsSeparatedByString(" "); 
     for val in array { 
      listItems[val.integerValue].completed = true 
     } 
    } 

И, естественно, не забудьте позвонить loadInitialData() в вашем viewDidLoad()

Спасибо всем, что помогли мне :)

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