2015-10-27 7 views
-3

Я делаю приложение, в котором пользователи могут публиковать комментарии и/или напоминания. Я хотел бы реализовать большие пальцы вверх/вниз, похожие на YouTube. У меня есть два IBActions для кнопок типа «нравится» и «не нравится». Мой вопрос в том, как отменить выбор кнопки, когда выбрана другая кнопка, и уменьшить/увеличить значение каждой кнопки? Наоборот? Вот следующий код.Thumbs Down - система голосования на YouTube, где пользователь может голосовать только один раз, но может измениться с того, чтобы не понравиться, наоборот

@IBAction func dislikeButton(sender: UIButton) { 



    let selected: Bool = !sender.selected 

    var likeCount: Int = Int((sender.titleLabel?.text)!)! 

    if selected { 
     //upvote 
     likeCount++ 
     print("inc \(likeCount)") 

    } else { 
     //downvote, but do not allow negative values 
     if likeCount == 0{ 
      likeCount = 0 
     } else { 
      likeCount-- 
     } 
     print("dec \(likeCount)") 
    } 
    sender.setTitle(String(likeCount), forState: UIControlState.Normal) 
    sender.selected = !sender.selected 


} 





@IBAction func likeButton(sender: UIButton) { 

    let selected: Bool = !sender.selected 

    var dislikeCount: Int = Int((sender.titleLabel?.text)!)! 

    if selected { 

     //upvote 
     dislikeCount++ 
     print("inc \(dislikeCount)") 

    } else { 
     //downvote, but do not allow negative values 
     if dislikeCount == 0{ 
      dislikeCount = 0 
     } else { 
      dislikeCount-- 
     } 
     print("dec \(dislikeCount)") 
    } 
    sender.setTitle(String(dislikeCount), forState: UIControlState.Normal) 
    sender.selected = !sender.selected 

} 

ответ

1

Обычно лучше отделить модель от вида. То есть лучше спроектировать (в вашем случае), чтобы сохранить голосование пользователя (например,/dislike/none), и подсчет голосов напрямую, а не косвенно, поскольку состояния кнопок и метки.

class VotableItem { 

    // Votes: -1 for dislike, 1 for like, 0 for no vote 
    var vote: Int = 0 // initialize to user's existing vote, retrieved from the server 
    var likeCount: Int = 0 // initialize to existing like count, retrieved from the server 
    var dislikeCount: Int = 0 // initialize to existing dislike count, retrieved from the server 

Вы также будете нуждаться в розетках, подключенные к подобной и неприятию кнопки, чтобы обновить их:

@IBOutlet var likeButton: UIButton! 
    @IBOutlet var dislikeButton: UIButton! 

Когда пользователь нажимает кнопку Like, есть два возможные действия. Если существующее голосование «похоже» (хранится как 1), она хочет отменить ее «похожее» голосование и вернуть свой голос «нет» (хранится как 0). В противном случае существующее голосование было либо «неважно», либо «не нравится» (хранится как -1), и она хочет отменить свое существующее голосование и поставить свой голос «как».

Аналогично, когда пользователь нажимает кнопку «Не нравится», возможны два действия. Если ее нынешнее голосование «не понравилось», она хочет отменить его, установив его «нет». В противном случае она хочет отменить свое существующее голосование «как» или «нет» и назначить свой голос «нелюбовь».

Обратите внимание, что отмена голосования «нет» не имеет никакого эффекта, но логика проще, если мы разрешим ее уничтожить (ничего не делая).

Поскольку действия кнопок Like и Dislike настолько схожи, мы можем отбросить общее поведение. Подключение кнопки к этим действиям:

@IBAction func dislikeButtonWasClicked(sender: UIButton) { 
     buttonWasClickedForVote(-1) 
    } 

    @IBAction func likeButtonWasClicked(sender: UIButton) { 
     buttonWasClickedForVote(1) 
    } 

Затем реализовать функцию buttonWasClickedForVote(_:):

private func buttonWasClickedForVote(buttonVote: Int) { 
     if buttonVote == vote { 
      // User wants to undo her existing vote. 
      applyChange(-1, toCountForVote: vote) 
      vote = 0 
     } 

     else { 
      // User wants to force vote to toggledVote. 
      // Undo current vote, if any. 
      applyChange(-1, toCountForVote: vote) 
      // Apply new vote. 
      vote = buttonVote 
      applyChange(1, toCountForVote: vote) 
     } 

     updateUserInterfaceFromModel() 
    } 

Я использую вспомогательную функцию для обновления счетчиков. Обратите внимание, что он не делает ничего, если голосование 0 (что означает «нет»):

private func applyChange(change: Int, toCountForVote vote: Int) { 
     if vote == -1 { dislikeCount += change } 
     else if vote == 1 { likeCount += change } 
    } 

И нам нужна еще одна функция, чтобы состояние UI соответствовать модели:

private func updateUserInterfaceFromModel() { 
     likeButton.selected = vote == 1 
     likeButton.setTitle("\(likeCount)", forState: .Normal) 
     dislikeButton.selected = vote == -1 
     dislikeButton.setTitle("\(dislikeCount)", forState: .Normal) 
    } 

Обратите внимание, что функция updateUserInterfaceFromModel не зависит от текущего состояния пользовательского интерфейса. Это означает, что вы можете использовать его и при инициализации. Просто установите vote, likeCount и dislikeCount (предположительно на основе данных с сервера). Затем, в viewDidLoad, позвоните по телефону updateUserInterfaceFromModel.

+0

Эй, действительно, признателен за ответ! как я могу сохранить это в базе данных Parse? –

+0

Для этого вам потребуется прочитать документацию по анализу, и, возможно, после изучения учебника по API-интерфейсу вы можете ознакомиться с инструкцией по анализу. –

+0

Спасибо. Я пробовал ваш код, но получаю ошибку здесь: последняя функция: func updateUserInterfaceFrommodel() .. im получение фатальной ошибки: неожиданно обнаружено nil wille, развертывание необязательного значения ... помощь приветствуется! –

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

  • Нет связанных вопросов^_^