2014-10-23 4 views
10

Apple 설명서에 따르면 "위젯이 최신 상태로 표시되도록하기 위해 시스템에서 때때로 위젯보기의 스냅 샷을 캡처합니다 .Widget이 다시 표시되면 시스템까지 가장 최근의 스냅 샷이 표시됩니다 그것을 라이브 버전의보기로 바꿉니다. "오늘 다시 그리기 할 때 확장보기 깜박임

그러나 라이브 뷰를 준비하기 전에 스냅 샷이 화면에서 제거됩니다. 이로 인해 이전 스냅 샷이 화면에서 사라지고, 초 단위로보기가 비어있는 경우 새로운 효과가 나타납니다.

개발자가 스냅 샷과 라이브 뷰 사이를 전환하는 작업을 원활하게 수행합니까? 그렇다면 그 뒤에있는 전략은 무엇입니까? 전환을 직접 제어 할 수있는 방법이 없습니다.

나는 widgetPerformUpdateWithCompletionHandler에 데이터로드를 이동하여 크게 영향을 완화 할 수 있었다 : 및 viewWillAppear에 그리기 유지 :,하지만 난 여전히 플래시가 한 번 매 15 (정도) 알림 센터의 열립니다 볼 수 없습니다.

답변

20

나는이 똑같은 문제를 가지고 있었고, 마침내 내가 나의 위젯과 관련된 문제를 발견했다. 그것은 내 위젯 라이프 사이클에 대한 오해와 관련이 있음이 밝혀졌습니다.

문서에서 나는 widgetPerformUpdateWithCompletionHandler 메서드 완료 핸들러가 성공적으로 호출 될 때까지 오늘의 뷰가 내 위젯 상태의 '스냅 샷'을 유지할 것이라고 생각했습니다.

이것은 그렇지 않습니다. 내가 볼 수있는 것으로부터 '스냅 샷'은 Today View가 애니메이션으로 표시 될 때 (사용자가 알림 센터를 당길 때)에만 사용됩니다. 오늘보기가로드되고 고정되면 위젯이 처음부터로드되고 (사용하는 경우 xib에서 부풀려 짐) viewDidLoad이 호출됩니다. 현재 웹 요청이 아닌 캐시 된 데이터로 위젯을 채워야합니다. 그렇지 않으면 펜촉의 임시 데이터가 표시됩니다. 이것이 깜박이는 원인입니다.

viewDidLoad이 완료되면 신선한 데이터를 가져올 수있는 widgetPerformUpdateWithCompletionHandler이 호출됩니다. 새로운 데이터를 가져올 때 완료 핸들러를 호출하여 데이터를 캐쉬해야 나중에 위젯이 처음부터 다시로드 될 때 사용할 수 있습니다 (viewDidLoad).

데이터를 캐시하는 간단한 방법은 사용자 기본값입니다.

+0

"스냅 샷"에 대한 오해는 내 스냅 샷 오해와 정확히 같습니다. 연구 및 의견을 보내 주셔서 감사합니다. 내가 그 플래시 샷을 풀어주고 내 플래시 문제를 해결할 수 있는지 알려 줄 것이다. (나는 당신이 묘사 한대로 생각할 것이다. – christopherdrum

+0

좋습니다. 만약 당신의 문제를 해결하면 알려주세요 :) – bencallis

+0

@christopherdrum이게 좋았나요? 그렇다면 다른 사람을 도울 올바른 답으로 표시해야합니다. – bencallis

2

당신은

에서 편집 핸들러에 대해주의해야 - (무효) widgetPerformUpdateWithCompletionHandler : (무효 (^) (NCUpdateResult)) completionHandler

방법. 확장 기능에 오류가있을 수 있으며 매번 다시 뷰어가 호출되는 것을 볼 수 있습니다. 확장 기능을 디버거에 연결 (디버거 -> 프로세스에 연결 -> 확장 ID)하고 일부 중단 점을 넣어 결과를 확인하십시오.

+0

예,이 문제에 대한 광범위한 로깅 및 중단 점을 보았습니다. widgetPerformUpdateWithCompletionHandler :의 맨 처음에 중단 점을 배치하고 잠시 기다리면 위젯 내용이 완전히 사라집니다. 이것은 데이터로드 또는 UI 레이아웃 또는 그 이전의 것입니다. 보기가 나타날 때마다 widgetPerformUpdateWithCompletionHandler :가 호출되는 것은 사실이지만 8.1 설명서와 일치합니다. 확실하지 않은 것은 뷰 컨트롤러 메소드가 위젯의 순서와 시간으로 호출되는 방식입니다. 그들은 전형적인 뷰 컨트롤러처럼 행동하지 않습니다. – christopherdrum

+0

오류가없는 경우 실제로 작동합니다. 나는 당신의 코드에 대해 아무 것도 모른다. 그러나 오류가 발생하여 오류가 발생하여 뷰가 사라지는 이유가있다. 문제를 확인하려면 장치 시스템 로그를 확인하십시오. –

+0

글쎄, 나는 크래시 로그에 아무것도 보지 못했다. 그러나 귀하의 충고와 함께 계속해서 우리가 아직 발견하지 못한 다른 오류가 있는지 살펴 보겠습니다. – christopherdrum

관련 문제