Кнопка с Timer.Interval никогда не заканчивается, когда кнопка нажимается более одного раза до окончания таймера - PullRequest
0 голосов
/ 17 марта 2020

Я работал над этим приложением «Правда, вызов или выпивка», и у меня есть button, который, когда его нажатие вращает карту в течение 3 секунд, затем случайным образом выбирает карту Правда, вызов или выпить со случайной правдой или осмелитесь go вместе с ним.

Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что если вы нажмете button более одного раза, прежде чем timer закончится, он просто сохранит Я иду и никогда не останавливаюсь.

Я пытаюсь найти способ сделать button disabled до тех пор, пока timer не закончится или что-то еще, но я не смог ничего понять , У кого-нибудь есть идеи относительно того, как я мог бы это исправить? Я в растерянности.

import SwiftUI
import CoreHaptics



class Colors{
    static var drinkGradient = [LinearGradient(gradient: Gradient(colors: [Color("drinkcard"), Color("drinkcard2"), Color("drinkcard")]), startPoint: .top, endPoint: .bottom)]
    static var truthGradient = [LinearGradient(gradient: Gradient(colors: [Color("truthcard"), Color("truthcard"), Color("truthcard")]), startPoint: .top, endPoint: .bottom)]
    static var dareGradient = [LinearGradient(gradient: Gradient(colors: [Color("darecard"), Color("darecard"), Color("darecard")]), startPoint: .top, endPoint: .bottom)]

}

class TruthorDares{
    static var truths = [String("Have you ever walked in on your parents doing it?"), String("Have you ever tasted a booger?"), String("Have you ever farted in an elevator?"), String("Have you ever peed yourself?"), String("What would be in your web history that you’d be embarrassed if someone saw?"),
    String("Who is the sexiest person in this room?"), String("What was the last thing you texted?"), String("What is the most illegal thing you have ever done?"),
    String("Would you rather lose your sex organs forever or gain 200 pounds?"), String("If someone offered you $1 million to break up with your girlfriend/boyfriend, would you do it?")]
    static var dares = [String("Let someone put lipstick on your lips."), String("Drink a glass of wine in less than 15 seconds."), String("Fill your mouth with water and try singing a song."), String("Striptease for thirty whole seconds."), String("Remove the socks of a person sitting next to you with your teeth."), String("Take off one item of clothing."), String("Wet your hair and apply shampoo, but don’t rinse it off."), String("Most the most embarrassing photo of yours, as FB profile picture."), String("Let someone sitting next to you spank you."), String("Call a random number and talk dirty to them.")]
    static var placeHolders = [String("")]
    static var drink = [String("Take a shot, or chug the rest of your drink!!")]

}

struct ContentView: View {

    // Picks foreground color based on which card is picked
    @State private var foregroundPicker = [1]
    // Picks which placeholder is going to be chosen based on which card is picked
    @State private var randText = [0]
    //Picks the random truth, dare or drink string from the TruthorDares class depending on which card is chosen
    @State private var placeHolder = [String("")]

    @State private var timer:Timer!
    //Picks which text to be shown on card
    @State private var text = [String("Truth"), String("Dare"), String("Truth"), String("Dare"), String("Truth"), String("Dare"), String("Drink!!")]
    @State private var foregrounds = [Color.white, Color.black]
    //Picks which text and card color are chosen
    @State private var number = [0]
    //Keeps time for the time interval in the spin button
    @State private var timeKeeper: Float = 0
    //For keeping the card spinning
    @State private var angle: Double = 0
    let generator = UINotificationFeedbackGenerator()
    //For choosing the color of the card depending on which text is chosen
    @State var backgrounds = [Colors.truthGradient[0], Colors.dareGradient[0], Colors.truthGradient[0], Colors.dareGradient[0], Colors.truthGradient[0], Colors.dareGradient[0], Colors.drinkGradient[0]]




    var body: some View {

        ZStack{
            //Background
            Rectangle()
                .foregroundColor(Color("background"))
                .edgesIgnoringSafeArea(.all)
            VStack{
                HStack {
                    //Top banner
                    Text("Truth, Dare or Drink")
                        .shadow(radius: 10)
                        .padding(.top, 20)
                        .foregroundColor(.white)
                        .font(.system(.largeTitle, design: .rounded) )
                        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 100)
                        .background(Color("banner"))
                        .edgesIgnoringSafeArea(.top)
                        .shadow(radius: 15)
                }

                //Where the truth or dare will go depending on which one is picked
                Text(String(placeHolder[0]))
                    .frame(width: 350, height: 200)
                    .foregroundColor(.white)
                    .font(.system(.headline, design: .rounded))

                Spacer()
                //The truth, dare or drink random card
                Text(text[number[0]])
                    .font(.system(.largeTitle, design: .rounded))
                    .foregroundColor(foregrounds[foregroundPicker[0]])
                    .frame(width: 250, height: 250)
                    .background(backgrounds[number[0]])
                    .clipShape(RoundedRectangle(cornerRadius: 15, style: .continuous))
                    .shadow(radius: 10)
                    .rotationEffect(.degrees(angle))
                    .animation(.easeIn)

                Spacer()

                Button(action: {
                    self.timer = Timer.scheduledTimer(withTimeInterval: 0.10, repeats: true, block: {_ in

                        self.timeKeeper += 0.10
                        let impactHeavy = UIImpactFeedbackGenerator(style: .heavy)
                        impactHeavy.impactOccurred()
                        if self.timeKeeper < 3{
                            if self.number[0] == self.text.count - 1{
                                self.number[0] = 0
                                self.number[0] += 1
                                self.angle += 360
                            }
                            else{
                                self.number[0] += 1
                                self.angle += 360
                            }
                        }
                        else{
                            self.number[0] = Int.random(in:
                                0...self.text.count - 1)
                            self.angle += 360
                            self.timeKeeper = 0
                            if self.number[0] == 0 || self.number[0] == 2 || self.number[0] == 4{
                                self.placeHolder[0] = TruthorDares.truths.randomElement()!
                                self.foregroundPicker[0] = Int(1)
                            }
                            else if self.number[0] == 1 || self.number[0] == 3 || self.number[0] == 5{
                                self.placeHolder[0] = TruthorDares.dares.randomElement()!
                                self.foregroundPicker[0] = Int(0)
                            }
                            else{
                                self.placeHolder[0] = TruthorDares.drink.randomElement()!
                                self.foregroundPicker[0] = Int(1)
                            }
                            self.timer.invalidate()
                        }
                    })
                }) {
                    Text("Spin")
                        .font(.system(.title, design: .rounded))
                        .foregroundColor(.white)
                        .frame(width: 250, height: 50)
                        .background(Color("button"))
                        .clipShape(RoundedRectangle(cornerRadius: 15, style: .continuous))
                        .shadow(radius: 15)

                }
                Spacer()
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Вы можете просто сделать оператор if, который проверяет, работает ли таймер, и если да, то повторно активируйте кнопку. и если таймер перезапускается, можно нажать кнопку. Имеет смысл?

, чтобы отключить кнопку в Swift, выполните: buttonName.isEnabled = false

, а затем, чтобы снова включить ее, просто переключите false на true

0 голосов
/ 17 марта 2020

Я бы просто набрал:

@State private var isBusy = false

и использовал бы его в кнопке:

Button(action: {
  if !self.isBusy {
  self.isBusy = true
  // ... your code here
}

и непосредственно перед таймером:

self.isBusy = false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...