타이머가 멈출 때 소리 swiftUI Apple Watch

나를

현재 Apple Watch 용 타이머 앱을 개발 중입니다. 타이머가 5 초가되면 소리가납니다. "완료"를 눌렀을 때만 타이머 소리가 계속 재생되고 이제 소리를 중지하는 방법은 설명하지 않습니다. WKInterfaceDevice.current (). play (.success)를 사용하고 있습니다.

5 초 이내에 "취소"버튼을 누르고 "완료"버튼을 눌렀을 때 소리를 멈추고 싶습니다.

인터넷에서 아무것도 찾을 수 없습니다. WKInterfaceDevice에는 중지 기능이 없다고 생각합니다.

struct softView: View {

@State var timerVal = 10

var body: some View {

    VStack {

        if timerVal > 0 {
            Text("Time Remaining")
                .font(.system(size: 14))
            Text("\(timerVal)")
                .font(.system(size: 40))

                .onAppear(){
                    Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
                        if self.timerVal > 0 {
                            self.timerVal -= 1
                        }
                        if self.timerVal < 6 {
                            WKInterfaceDevice.current().play(.success)
                        }
                    }
            }
            Text("Seconds")
                .font(.system(size: 14))
            Divider()
            Spacer()

            NavigationLink(destination: ContentView(), label: {Text("Cancel")})
            //.cornerRadius(20)
            .foregroundColor(Color.red)
            .background(
                RoundedRectangle(cornerRadius: 20)
                    .stroke(Color.red, lineWidth: 2)

            )



        }
        else {

            NavigationLink(destination: ContentView(), label: {Text("Done")})
                .foregroundColor(Color.green)
                .background(
                    RoundedRectangle(cornerRadius: 20)
                        .stroke(Color.green, lineWidth: 2)

                )
        }

    }         .navigationBarHidden(true)

}
staticVoidMan

timer멈춰야 할 때를 언제 아십니까?
타이머가 중지 될 때 이벤트를 정의해야합니다. 그것이 .invalidate편리한 입니다.

기본 예 :

Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] (timer) in
  guard let _weakSelf = self else { timer.invalidate(); return }

  _weakSelf.timerVal -= 1

  if _weakSelf.timerVal < 0 { //if timer count goes negative then stop timer
    timer.invalidate()
  } else if _weakSelf.timerVal < 6 {
    WKInterfaceDevice.current().play(.success)
  }
}

더 많은 제어를 위해, 예를 timer들어 버튼 탭에서 중지하려면 timer개체를 전역 으로 만들어야합니다 .
또한 완료 / 취소 View팝업을 표시하려면 timer더 많은 변경이 필요합니다.
이 모든 것이 조금 복잡해 지지만 이해하기 쉽습니다.
타이머 관련 로직을 ObservableObject클래스 로 나누고 View.

예:

struct ContentView: View {
  @State var isShowingTimer: Bool = false

  var body: some View {
    NavigationView {
      NavigationLink(destination: TimerView(isShowing: $isShowingTimer),
                     isActive: $isShowingTimer) {
                      Text("Start Timer")
      }
    }
  }
}
  • isShowingTimer 푸시 / 팝 이벤트를 제어합니다. TimerView
    • 튀어 TimerView나오기 TimerView위해 내부 에서 업데이트 할 수 있도록 바인딩으로 전송됩니다 .

struct TimerView: View {
  //Trigger for popping this view
  @Binding var isShowing: Bool

  @ObservedObject var timerControl = TimerControl()

  var body: some View {
    VStack {
      Text("\(timerControl.count)")
        .onAppear(perform: {
          //start timer event
          self.timerControl.startTimer(from: 10)
        })
        .onDisappear(perform: {
          //stop timer if user taps on `Back` from the Navigation Bar
          self.timerControl.stopTimer()
        })
        .onReceive(timerControl.$isComplete, //observe timer completion trigger
                   perform: { (success) in
                    //hide this view
                    self.isShowing = !success
        })
        Text("Cancel")
          .onTapGesture(perform: {
            //stop timer event
            self.timerControl.stopTimer()
        })
    }
  }
}

class TimerControl: ObservableObject {
  @Published var count: Int = 0
  @Published var isComplete: Bool = false

  private var timer: Timer?

  init(){}

  func startTimer(from count: Int) {
    self.count = count

    timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] (timer) in
      guard let _weakSelf = self else { timer.invalidate(); return }

      print(_weakSelf.count)
      _weakSelf.count -= 1

      if _weakSelf.count <= 0 {
        _weakSelf.stopTimer()
      } else if _weakSelf.count < 6 {
        print(">>make some noise here<<")
      }
    }
  }

  func stopTimer() {
    guard isComplete == false else { return }
    timer?.invalidate()
    isComplete = true
  }
}

  • ObservableObject 클래스는 변경 사항을 내보낼 수 있습니다
  • @Published 변수는 변화의 신호를 내 보낸다
  • @ObservedObject 변경 사항을 수신합니다. ObservableObject
  • .onReceivePublisher이벤트를 처리 합니다. 이 경우 변경 사항을 수신합니다.timerControl.$isComplete

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

타이머가 멈출 때까지 기다리는 방법

내 Apple Watch 앱을 제출할 때 아이콘 누락 오류

자바에서 타이머가 멈출 때까지 기다리는 방법은 무엇입니까?

타이머가 멈출 때까지 더 느리게 만들려면 어떻게 해야 합니까?

타이머가 때때로 블록을 너무 빨리 호출하는 이유

제출시 Apple Watch 아이콘 문제

버튼을 눌렀을 때 출력 출력-Xcode Swift Apple Watch?

React : 사용자가 타이핑을 멈출 때 트리거 기능

Apple Watch용 모달 시트의 SwiftUI 이미지

마우스가 jQuery의 요소에서 이동을 멈출 때

SwiftUI-타이머가 0에서 멈추지 않습니다.

Apple Watch 모달 인터페이스 컨트롤러에서 취소 버튼을 클릭 할 때 확인

SwiftUI-Apple Watch 메뉴 (Force Touch)

릴리스 빌드시 SwiftUI Apple Watch 앱 충돌 (Series 3 만 해당)

릴리스 빌드시 SwiftUI Apple Watch 앱 충돌 (Series 3 만 해당)

스윙 타이머가 멈출 때까지 이벤트 디스패치 스레드를 보류

Apple Watch에서 SwiftUI의 NavigationView에 뒤로 버튼이 없습니다.

Apple Watch 및 iPhone에서 SwiftUI를 사용한 장치 별 레이아웃

My Timer is going crazy , 1이어야 할 때 2, 3초씩 감소합니다(타이머가 매초 호출됨)

Apple Watch Extension을 추가 한 후 Xcode가 로딩 휠에서 멈춤

React를 사용하여 드래그가 멈출 때 Draggable 구성 요소의 위치를 되돌리는 방법

Apple Watch용 동일한 iOS Xcode 프로젝트에서 스토리보드와 SwiftUI를 사용할 수 있는 방법이 있습니까?

iOS 용 Apple Watch (WatchKit) 레이아웃 스타일 라이브러리

Apple Watch to Watch 커뮤니케이션

타이머가 실행 중일 때 SwiftUI ActionSheet가 닫히지 않음

Apple Watch Glance가 나타나는 방식

Apple Watch에서 WKInterfaceImage 이동

RFID 리더가 Apple Watch를 감지합니까?

Metronome SwiftUI, @State var가 변경될 때마다 타이머 간격 변경

TOP 리스트

  1. 1

    PrematureCloseException : 연결이 너무 일찍 닫혔습니다.

  2. 2

    MDRotatingPieChart를 회전하면 각도 대신 x / y 위치가 변경됩니다.

  3. 3

    c # 웹 사이트에서 텍스트를 복사하는 방법 (소스 코드 아님)

  4. 4

    jfreecharts에서 x 및 y 축 선을 조정하는 방법

  5. 5

    ArrayBufferLike의 typescript 정의의 깊은 의미

  6. 6

    Ionic 2 로더가 적시에 표시되지 않음

  7. 7

    복사 / 붙여 넣기 비활성화

  8. 8

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    QT Designer를 사용하여 GUI에 이미지 삽입

  11. 11

    java Apache POI Word 기존 테이블 셀 스타일 및 서식이있는 행 삽입

  12. 12

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

  13. 13

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  14. 14

    C # HttpWebRequest 기본 연결이 닫혔습니다. 전송시 예기치 않은 오류가 발생했습니다.

  15. 15

    어떻게 같은 CustomInfoWindow 다른 이벤트를 할 수 있습니다

  16. 16

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  17. 17

    dataSnapShot.getValue () 반환 데이터베이스에 그겁니다 데이터 종료 널 (null)

  18. 18

    ORA-12557 TNS : 프로토콜 어댑터를로드 할 수 없습니다

  19. 19

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  20. 20

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  21. 21

    C # Asp.net 웹 API-JSON / XML 변환기 API 만들기

뜨겁다태그

보관