2012-01-01 6 views
7

먼저 작은 배경. 저는 iOS 개발에 익숙하지 않았습니다. 오랫동안 .NET 토지에 있었고 아마도이 질문을하는 이유 일 수도 있습니다. 그러나 여기에 있습니다.하나의보기 컨트롤러에서 다른보기 컨트롤러로 데이터 전달. iOS <= 4 대 iOS 5

기본 설정은 이것이다. UINavigationControllerRootViewController이 있고 MasterViewController이라고합니다. 이 MasterViewController에서 어떤 동작이 발생하면 DetailsViewController으로 드릴합니다. 그러나 일부 데이터를 DetailsViewController에 전달하려고합니다. 그러나, 이제, 아이폰 OS 5, 그것은이 지금 할 것 같다

@implementation MasterViewController 

    -(IBAction)someAction 
    { 
     DetailsViewController *dvc = [[DetailsViewController alloc]initWithNibName:@"DetailsView" bundle:nil]; 
     dvc.someDataProp = [self getSomeDataSomeHow]; 
     [[self navigationController] pushViewController:dvc animated:YES]; 
    } 

@end 

을 :

IT는 SDK의 이전 버전 (전에서 iOS 5에) 접근이에 비슷한 것을, 나의 이해이다 Storyboard와 segues를 사용합니다. 엑스 코드에서 당신은 DetailsViewController에 MasterViewController에서 SEGUE를 설정 한 다음 코드에서 당신이 뭔가를 할 :

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    [segue.destinationViewController setSomeDataProp:[self getSomeDataSomeHow]]; 
} 

내 질문은 기본적으로 이것이다 : 오래된 접근 방법은 어떻게 든 나에게 많은 청소기 느낀다. 네비게이션 스택으로 밀어 넣는 ViewController의 유형에 대해 매우 명시 적으로 다루고 있으며 여기에 속성을 쉽게 설정할 수 있습니다. 그러나 새로운 접근 방식에서, destinationViewController은 (분명한 이유) 타입 id의, 그리고 그것은 단지 나에게 적은 깨끗한 많이 느낀다. 다시 말하지만, 이것은 .Net 사이드가 나올 수 있지만, iOS에서는 일반적입니다. 그냥 신분증을 사용하고 바람에주의를 기울이시겠습니까?

+1

많은 존경. 나는 또한 비슷한 질문을했고 여기에 몇 가지 경험이있다. 나의 대답은 iOS5에서 UI 로직이 2) ViewController 라이프 사이클과 전환 2) 데이터 흐름으로 나뉘는 것을 볼 수있다.스토리 보드는 1을 처리하고 개발자는 2를 처리 할 것으로 예상됩니다. 이러한 시나리오에서 이러한 캐스트가 발생합니다. 나를 위해, 질문은,이 분할은 이해가 되는가? 이 두 개념을 분리 할 수 ​​있습니까? 나는 애플이 그런 식으로 가고있는 것을 추측한다. 그리고 우리는 그것이 어떻게 작동하는지 알 것이다. – Guven

답변

6

스토리 보드를 사용하면 세그먼트에 명명 된 식별자를 할당 할 수 있습니다. 세그를 선택하고 속성 속성에서 세그레스 식별자에 이름을 추가 할 수 있습니다.

그리고 prepareForSegue 방법이 식별자를 확인해야하며, 따라서 명시 적으로 수행하고 destinationViewController이 될 것입니다 무엇에 대한 어떤 SEGUE 알에서

. 많은 경우에

if ([segue.identifier isEqualToString:@"My First Segue Identifier"]) 
{  
    DetailsViewController *dvc = (DetailsViewController *) segue.destinationViewController; 
    // Set the DVC's properties 
} 
+0

더 나은,하지만 당신은 여전히 ​​거기에 그 못생긴 캐스팅 있습니다. 이것이 바람직한 접근 방법입니까? – BFree

+0

이것이 바람직한 접근 방식입니다. 당신이 옳아 요, 낡은 방식은 더 분명하고 분명합니다. 새로운 방법을 사용하면 스토리 보드에 "결합"할 수 있습니다. 불행히도 새로운 정적 및 동적 UITableView 디자이너 지원과 같은 XIB 디자이너에 포함되지 않은 스토리 보드에서만 발견되는 새로운 기능이 있습니다. –

+1

은'prepareForSegue' 메소드 내에 삽입 된이 코드 스 니펫입니까? – chwi

4

하는 SEGUE의 대상 뷰 컨트롤러는 UINavigationViewController 수 있으며,이 경우, 솔루션 (위 데니스 매튜스 '솔루션의 약간의 수정) 메시지 "topViewController"를 사용해야합니다 : 그 긴 아이폰 OS와 함께 작동되지 않은,하지만 난 당신이 때문에 오브젝티브 -C의 느슨한 결합 메시징 시스템의 캐스팅이없는 몇 가지 예를 본 적이

if ([segue.identifier isEqualToString:@"My First Segue Identifier"]) 
{  
    NavitationViewController* navController = [segue destinationViewController]; 
    DetailsViewController *dvc = (DetailsViewController*) [navController topViewController] 
    // Set the DVC's properties 
} 
+0

이것은 "NavigationViewController * navController"가 아니라 "UINavigationController * navController"를 의미하는 것 외에는 나에게 트릭입니다. – mpemburn

1

.

대신에 SEGUE 식별자를 확인하거나 특정의 ViewController에 캐스팅 당신은이 작업을 수행 할 수 있습니다

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.destinationViewController respondsToSelector: @selector(setCompany:)]) { 
     [segue.destinationViewController performSelector: @selector(setCompany:) withObject: self.company]; 
    } 
} 

을 첫 번째 줄에서 destinationViewController이 방법 setCompany이있는 경우 내가 (물어 당신은 속성이라는 기업이있는 경우 하나는 당신을 위해 생성됩니다). 그렇다면이 메소드를 호출하거나 두 번째 코드 줄을 사용하여 해당 속성을 설정할 수 있습니다.

그래서이 경우 당신은 정말 대상의 ViewController를 몰라도 쉽게 회사를 처리 지원하는 다른 것으로 교체 할 수있다. 이 단순히 복사 및 조각을 붙여보다는 수행하는 방법을 질문에 대한

관련 문제