2011-10-22 9 views
2

iOS5를 업데이트 한 후 내 앱에서 이상한 일이 발생했습니다.iOS5에서 UIPickerView selectedRowInComponent와 다른 이상한 동작이 발생했습니다.

나는 UIPickerView를 가지고 있으며 선택한 구성 요소를 가져 오는 데 [customPickerView selectedRowInComponent:0]을 사용합니다. 확인시

i = [customPickerView selectedRowInComponent:0]; // -> i is 1 here, is OK! 
[smsAgent sendSMS:smsTxt]; //just call another method to send a SMS 

i의 값은 OK이다 사용자

그래서 그것은 같다 (지수 1) 번째 행을 선택합니다.

smsAgent... 
     MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init]; 
     picker.messageComposeDelegate = delegate; 
     picker.recipients =[NSArray arrayWithObject: myTelNumber]; 
     [delegate presentModalViewController:picker animated:YES]; 

확실히 아무것도 안하고 내 피커 : 지금 난 그냥 같이 본질적으로 보이는 일반 SMS 대화 smsAgent를 호출합니다.

그러나

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result { 
     [self dismissModalViewControllerAnimated:NO]; //take away the SMS screen fast, so we can send selectModeVCDidFinish to take away ourselves 
     int j = [customPickerView selectedRowInComponent:0]; 
     [self.delegate selectModeVCDidFinish: selectedMode]; 
} 

이 "반환"값 j는 다시 0 일 때, 1이 아닌!

customPickerView에는 아무런 변화가 없습니다. 실제로 당황합니다.

iOS5로 업데이트하기 전에 아무런 문제가 없었습니다.

내가 빠뜨린 것이 있습니까?

많은 감사

나는 내 댓글에 기록 된 것처럼
+0

이 호출이 모두 동일한 객체에 있습니까? 작성 컨트롤러에 대해 설정 한 "위임"은 포켓보기를 소유 한보기 컨트롤러입니까? 내 생각 엔 마지막 코드 세그먼트에서 customPickerView가 실제로 nil이라는 것입니다. – jrturton

+0

아니요 - 그렇지 않습니다. UIPickerView는 대리자로 자체를 제공하는 smsAgent 개체를 호출하는 개체 A에만 있습니다. 따라서 smsAgent는 UIPickerView를 보유하고있는 객체 A로 되돌아갑니다. 그러나 반환 후 picked value는 다시 올바르지 않습니다 ... – user387184

+0

'i'는 ivar처럼 보이기 때문에'j = i'를 설정하지 않으시겠습니까? – msgambel

답변

1

문제를 자세히 설명해 주셔서 감사합니다. 내 UIPickerViews에 문제가있었습니다. 위의 내 의견에서 언급했듯이 내 코드는 CustomPickerView를 기반으로했습니다. - http://iphonedevelopment.blogspot.co.uk/2009/02/longer-spinning-blurring-v20.html

이 코드는 버전 5.0에서 떨어졌습니다. 많은 연구를 한 후에 나는 UIPicker를 위해 호출되는 델리게이트 함수의 순서/순서에 문제가 없다는 것을 발견했다.

그러나 비공식 함수 "scrollAnimationDuration"은 특히 사용되지 않으며 더 이상 사용되지 않습니다. 이것이 UIPicker가 더 오랜 기간 동안 스크롤하지 않는 이유입니다 (iOS 4.3.3 이하 에서처럼).

-1

이 문제에 대한 이유는 메소드가 호출되는 순서입니다. 자세히 설명해 드리겠습니다.

시작 화면 screenVC에는 일반적인 메서드 viewWillAppear 및 viewDidAppear이 있습니다. 이러한 메시지 내에서 피커는 생성되거나 (또는 ​​요소가 무엇이든) 기본 데이터 구조에 의해 제공되는 값으로 설정됩니다. 그래서 피커가 10을 얻는다 고 말할 수 있습니다.

이제 변수에 넣는 20 개의 다른 값을 선택하면 이것이 SAVE 일 것이라고 생각합니다.

이제 SMS 대화 상자가 열리고 SMS가 전송됩니다.

하지만 지금은 이상한 문제가 발생합니다. SMS 대화 상자가 사라지면 viewVillAppear가 screenVC에서 실행되고, 변수 BACK이 10으로 설정됩니다 (데이터 구조가 아직 업데이트되지 않았으므로).

이제 sms가 didFinishWithResult로 돌아가고 기본 20이 손실됩니다.

sms didFinishWithResult 내에서 데이터 구조를 업데이트하는 데 사용되는 변수가 화면 닫기 호출과 함께 매개 변수로 전달되도록하기 만하면됩니다.

추가 문제. 더 놀라운 것은 screenVC가 picker 만 가지고있는 다른 screen2VC를 열고 (그리고 값을 10으로 설정 한 경우), 그러면이 대화 상자가 sms 대화 상자를 엽니 다. SMS 대화 상자가 반환되면 screen2VC는 viewWillAppear 및 viewDidAppear을 호출하지만이를 닫은 경우에도 호출합니다.

sms 대화 상자를 닫을 때 sms 대화 상자 시작 화면이 있어야하기 때문에 이런 상황이 발생할 것으로 생각됩니다.

잘 이해할 수있을만큼 충분히 설명 할 수 있기를 바랍니다. 분명하지 않은지 물어보십시오.

그리고 마지막 코멘트로 : 문제의 변수가 할당 된 코드에 디버그 문을 넣으십시오. 거기에서 당신이 기대하지 않았거나 생각할지라도 assignemnt가 호출되고 있음을 볼 수 있습니다.

+0

친애하는 downvoter - 당신의 downvote "대단히 감사합니다". 내가 한 모든 일은 내가 발견 한 세부 사항을 설명하기 위해 여분의 시간을 보냈습니다. 이것이 귀하의 경우와 동일하지 않은 경우에는 계속 진행하십시오 ... – user387184

+0

친애하는 user387184, 시간을내어 주셔서 감사합니다. 문제를 설명하십시오. 하지만 원래 게시물에 대한 내 이전 코멘트를 살펴 보지 않고 "현상금"에 대한 이유를 이해 한 것처럼 보입니다. 이는 불행한 일입니다. 당신이 설명하는 문제는 viewWillAppear/viewDidLoad에 대한 주문과 관련이 있습니다. UIPicker 문제 (이 문제의 핵심)는 어디에도 없습니다. 그러므로 나는 당신의 답을 downvote 할 것입니다. 그러나 당신의 시간을 설명해 주셔서 감사합니다. –

관련 문제