2012-05-15 3 views
4

내 앱의 한 화면에서 (모델에서) 저장하고 사용자가 동일한 페이지로 다시 이동하는 경우 검색하려는 데이터 문자열이 있습니다. 지금은 데이터가 모델에 잘 저장되어 있지만 컨트롤러의 새 인스턴스를 생성하는 화면으로 돌아올 때마다 나타나는 것처럼 보입니다. 따라서 내 모델은 내 참조가 손실되어 (현재 내 컨트롤러에 인스턴스 변수로 저장되어 있기 때문에) 좋지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?iOS 앱의 화면간에 데이터를 유지하는 방법은 무엇입니까?

답변

3

내가 뭘 잘못하고 있니?

일반적으로 문서 또는 응용 프로그램에서 공유되는 모델 (개체 컬렉션 일 수도 있지만 반드시 하나 일 필요는 없음)이 있습니다. 뷰 컨트롤러가 생성되면 모델 (또는 모델의 일부)에 대한 참조가 제공됩니다. 그런 다음 다른보기 컨트롤러를 만들면 해당 모델에 대한 참조가 해당 객체로 전달됩니다. 따라서 모델은 모든 뷰 컨트롤러에서 공유됩니다. 다른 컨트롤러가 뷰 컨트롤러를 알고 있기 때문에보기 컨트롤러가 할당 해제 된 경우 모델은 잊지 않습니다.

모델의 시작 부분이있는 것처럼 들리지만 단일보기 컨트롤러로 제한됩니다. 어쩌면 다른 뷰 컨트롤러 중 일부와 동일한 상황이 발생했을 수도 있습니다. 모든 작은 모델을 어떻게 큰 오브젝트 그래프로 묶을 수 있는지 생각해보십시오. 이렇게하면 기억하기가 더 쉬울뿐만 아니라 앱 위임자 또는 루트보기 컨트롤러와 같은 단일 개체에 전체 모델을 저장해야 할 책임이 있습니다.

0

이와 같이 소량의 데이터를 저장하는 데 가장 적합한 저장소 메커니즘 인 NSUserDefaults를 사용하여 모델 데이터를 디스크에 유지해야하는 것처럼 들립니다.

+0

매번 컨트롤러를 다시 만들어야합니까? 내 스토리 보드에는 사용자가 원을 그리며 탐색 할 수있는 화살표 원이 있습니다. – Nosrettap

+0

@nosrettap, 그건 당신 문제입니다. 원래 컨트롤러의 다른 인스턴스를 스택으로 밀어 넣으면 안됩니다. 원래 컨트롤러의 원래 인스턴스로 돌아가려면 다른 컨트롤러를 꺼야합니다. – Rob

+0

올바른 방법에 대해 다음 [SO 토론] (http://stackoverflow.com/questions/10544444/memory-not-releasing-with-arc-and-storyboard-in-ios-5-1/10564901#10564901)을 참조하십시오. 스택에서 뷰 컨트롤러를 팝하는 것. – Rob

0

당신이 고려할 수 적어도 다음과 같은 몇 가지 옵션이 있습니다

앤드류 말했듯이
  1. 는 NSUserDefaults를 통해 디스크에 데이터를 유지.
  2. 싱글 톤 디자인 패턴을 사용하여 응용 프로그램의 수명 동안 데이터를 유지할 데이터 "관리자"개체를 만듭니다.
  3. 왜보기 컨트롤러의 새 인스턴스가 생성되는지 (코드에 따라 명백하거나 분명하지 않을 수 있음) 알아보고보기 컨트롤러를 재사용하기 위해 약간 다르게 작업을 시도하십시오 (단순하거나 당신의 코드가 주어지면 어렵다.)

내 의견에 설명 된 스토리 보드를 사용하고 있다면 실제로하고 싶은 것은보기 컨트롤러의 탐색 패턴을 변경하는 것이 아니라면 옵션 2를 고려할 것입니다.

+0

컨트롤러를 탐색 컨트롤러 스택에 밀어 넣으면 계속 유지됩니까? 아니면 꺼낼 때 새 인스턴스가 만들어 집니까? – Nosrettap

+1

1) 사용자가 기본값을 사용하는 이유는 무엇입니까? 얼마나 많은 데이터가 있는지 전혀 알 수 없습니다. 디폴트 시스템은 사용하기 쉽지만 많은 사람들이이 방법을 악용으로 사용하는 것을 고려할 것입니다. 2) 부. 3) 컨트롤러를 다 끝냈다가 컨트롤러를 놓아도 아무 이상이 없으며, 컨트롤러를 두지 않아도됩니다. 모델을 지속하는 것이 중요합니다. 뷰 컨트롤러, 아니요. – Caleb

+0

@Nosrettap, 스택에서 컨트롤러를 밀면 이전 스택이 유지됩니다. 스택에서 마지막 스택을 꺼내면 이전 스택은 계속 유지됩니다 (그러나 사용자가 갑자기 닫은 스택이 사라 졌으므로 영구 스토어 (또는 싱글 톤)에 저장하지 않으면 데이터가 사라집니다). – Rob

0

네비게이션으로보기 컨트롤러를 밀고 다시 돌아 오면 을 유지합니다. 그러나 여전히 여러 화면에 걸쳐 일부 데이터를 유지하려면 싱글 톤 인스턴스를 사용하는 것이 좋습니다.

관련 문제