2016-05-16 4 views
1

Я хочу сделать повторный список, как на картинке ниже, для моего приложения будильника в быстром режиме, я пробовал свои силы, но все мои попытки потерпели неудачу, как я могу это сделать, как я могу сэкономить несколько значений в одном атрибуте в базе данных, мне нужен массив, как я могу сделать контрольный список; мой проект почти завершен, осталось только повторить список, который я не смог сделать егоразработка списка повторяющихся списков аварийных сообщений

заранее спасибо

Reminder.swift

verride func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 


     if segue.identifier == "presentDay" { 

      if let daysPickerVie 

wController = segue.destinationViewController as? Days { 
      let path = tableView.indexPathForSelectedRow 
      detailLabel.text = daysPickerViewController.days[(path?.row)!] 
     } 
    } 
} 

Days.swift

class Days: UITableViewController 
{ 
    var lastSelectedIndexPath = NSIndexPath(forRow: -1, inSection: 0) 

    let days = [ 
     "Everyday", 
     "Saturday", 
     "Sunday", 
     "Monday", 
     "Tuesday", 
     "Wednesday", 
     "Thursday", 
     "Friday"] 


    var selectedDay:String? 
    var selectedDayIndex:Int? 
    var cell:UITableViewCell? 


    override func viewDidLoad() { 
     //navigationController?.navigationBar.topItem?.title = "Back" 
    } 

extension Days{ 


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return days.count 
     } 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
      let cell = tableView.dequeueReusableCellWithIdentifier("daySelected", forIndexPath: indexPath) as UITableViewCell 


    cell.accessoryType = .None 
    cell.textLabel?.text = days[indexPath.row] 
    selectedDay = days[indexPath.row] 
    return cell 
    } 
} 

extension Days { 


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


      if let cell = tableView.cellForRowAtIndexPath(indexPath) { 
       if cell.selected { 
        cell.accessoryType = .Checkmark 
       } 
       } 

     } 
    override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) { 


      if let cell = tableView.cellForRowAtIndexPath(indexPath) { 
       cell.accessoryType = .None 
      } 


     } 

    } 

enter image description here

+0

может Прокомментируйте код, что вы пытались –

+0

Это может помочь: http://stackoverflow.com/questions/21481987/repeat-uilocalnotification-on-specific-day –

+0

@ Ramkumar chintala Я добавил код – User

ответ

1

Я думаю, что самый подходящий метод - это хорошая старая битовая маска. Признавая, что побитовые операции трудны для многих людей [1], вы найдете ниже решение, которое работает без побитовых операторов. Атрибут может быть типа Int и она может охватить все возможные варианты со следующей логикой:

0  no days selected 
1  Sundays selected 
2  Mondays selected 
4  Tuesdays selected 
8  Wednesdays selected 
// etc... 

сохраняемое значение является суммой всех выборов, таким образом, например, для каждого понедельника и пятницы это будет 2 + 32 = 34.

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

[1] В мире существует 10 видов людей. Те, которые понимают двоичные числа, и те, которые этого не делают.

+0

еще два дополнительных вопроса, мне нужен переключатель для этого процесса, например «case: 6» для понедельника и вторника или «случай 5» в воскресенье или вторник, но для этого потребуется длинный список все возможности; второй вопрос, когда я пытаюсь передать выбранный день в режим тревоги, я терпеть неудачу, я знаю, что буду использовать функцию «prepareForSegue», но единственное значение возвращается из списка повторов «ежедневно», даже если я выбрал разные дни, как это можно решить – User

+0

Это действительно разные проблемы. Вы должны спросить их, открыв новые вопросы.- Короткий ответ: Нет, в этом случае переключатель не подходит. Если вы не понимаете арифметики этой установки, возможно, вы над этим справляетесь. - Это вопрос структуры данных не зависит от любых проблем UIKit, которые могут возникнуть. – Mundi

+0

Спасибо Mundi, это отличный подход для сохранения. Спасибо Пользователь ваш код спас меня некоторое время. Я отправляю ответ на разбор вопрос данных для дальнейшего использования – toiavalle

0

У меня была такая же проблема, но решайте ее. Нет необходимости в методе «didDeselectRowAtIndexPath». Обновите код, как показано ниже:

var selectedIndexPaths = [IndexPath]() 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    let day = days[(indexPath as NSIndexPath).row] 
    cell.textLabel?.text = day 
    if self.selectedIndexPaths.contains(indexPath) { 
     cell.accessoryType = .checkmark 
    } 
    else { 
     cell.accessoryType = .none 
    } 

      return cell 
} 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let cell = tableView.cellForRow(at: indexPath) 
    if self.selectedIndexPaths.contains(indexPath) { 
     self.selectedIndexPaths.remove(at: self.selectedIndexPaths.index(of: indexPath)!) 
     cell?.accessoryType = .none 
    } 
    else { 
     cell?.accessoryType = .checkmark 
     self.selectedIndexPaths.append(indexPath) 
    } 
} 
0

Ответ на пользователе вопрос о Mundi Ответ для дальнейшего использования: не требуется переключатель. Просто проанализируйте данные как двоичные: так, например, 3 в двоичном формате 11 -> первый в 2-х случаях, а второй в 1-м случае. Таким образом, последняя цифра двоичного числа равна 1, тогда выбрано воскресенье. Если второй справа - 1, тогда выбирается вторник и так далее.

Пример

14 
In binary: 1110 
1st case from right is 0 -> Sunday is not selected 
2nd case from right is 1 -> Monday is selected 
3rd case from right is 1 -> Tuesday is selected 
4th case from right is 1 -> Wednesday is selected 
There are no more cases so no other day is selected 
Смежные вопросы