2010-11-27 4 views
1

한 뷰 컨트롤러를 다른 뷰 컨트롤러에서 참조하는 데 문제가 있습니다. 코드는 작동하지만 경고를 받으면 내가 잘못 생각할 것입니다. tableView에있는 controller의 데이터를 다시로드하려고 시도하고 있습니다. NavigationController에 있습니다.ViewController 계층을 적절하게 순회합니까?

AppDelegate에에서 :이 같은 메시지가 잘못 무엇
이 작동하지만 엑스 코드는 selectedViewControllernavigationController을 반환 것을 알고하지 않기 때문에

[self.tabBarController.selectedViewController.topViewController.tableView reloadData];

, 내가 경고 request for member 'topViewController' in something not a structure or union를 얻을. 그래서 내가 할 수있는 다음

UINavigationController *myNavigationController = self.tabBarController.selectedViewController; 
[myNavigationController.topViewController.tableView reloadData];

을하지만 나는이 경고를 얻을 : incompatible Objective-C types initializing 'struct UIViewController *', expected 'struct UINavigationController *'

얼마나 나는이 함께 가야합니까을? 첫 번째 줄이 작동합니다. "올바른 방법"을 얻으려면 8 줄의 코드가 필요합니까?

답변

4

주요 코드는 IMO에서 나옵니다. 당신은 (훌륭한) 거리에서 행동하려고합니다. 귀하가 성취하고자하는 바를 분명히 밝히지는 않았으며, 왜 당신이 애플 리케이션 위임자로부터 이러한 조치를 취해야하는지에 대해서도 명확하지 않습니다. 필자는 일부 개발자가 앱 대표단을 거대한 범행과 같은 진흙 덩어리처럼 취급하는 것을 보았습니다. 이것이 iOS 개발에서 제거되어야하는 반 패턴이라고 생각합니다.

질문으로 돌아 가기 : 탭보기 컨트롤러 안의 테이블보기 컨트롤러가 강제로 데이터를 다시로드하려고합니다. 나는 이것이 무슨 일이 일어난 것에 대한 반응이라고 가정하고 있습니다. 왜 그 테이블을 담당하는 뷰 컨트롤러가 앱 델리게이트 대신에 그 이벤트를 보도록할까요? 그렇게하면 테이블 뷰를 소유하는 것이 MVC 패턴 전체를 직접 제어하게됩니다. 이것은 응용 프로그램이 테이블 뷰를 찾기 위해 계층 구조를 드릴 다운하도록 위임하는 것보다 복잡성, 가독성 및 취성면에서 훨씬 나은 접근법입니다.

어떤 이유에서든 해당보기 컨트롤러가 이벤트를 직접 관찰하지 못하거나 가질 수없는 경우 (이유는 알기 어렵습니다) 언제든지 응용 프로그램 대리인에게 NSNotification 게시를 허용하고보기 컨트롤러 옵서버로서의 테이블 레지스터를 담당합니다. 직접적인 관찰만큼 좋지는 않지만 현재의 접근 방식보다 확실히 좋습니다.

+0

귀하의 요지를 봅니다. 이 작업을 시작하는 이벤트는 'app : handleOpenURL'을 통해 다른 앱에서 앱으로 전달 된 파일입니다. 'tableViewController' 메서드를 호출하여이 작업을 처리하게하면 (좋은 생각처럼 들리 네요). 'AppDelegate'에서'tableViewController'를 한 번 참조해야합니다. 나는이 문제와 관련해서 만이 딜레마를 자주 접한다. 그것은 내가 거미줄 일 때 다른 물건의 속성으로 하나의 물건을 끊임없이 저장하고있는 것처럼 보입니다. 이것이 내가 초기 코드 라인을 사용하려고하는 이유입니다. – Andrew

2

컴파일러에서 사용중인 개체 유형을 알지 못하고 해당 개체 유형이 해당 이름의 메시지를받을 수 없다면 점 표기를 사용할 수 없습니다.

있습니다 (이 경우, 무시 무시하게 추한) 타입 캐스트의 무리와 함께 도트 표기법을 사용할 수 있습니다

[((UITableViewController *) ((UINavigationController *) self.tabBarController.selectedViewController).topViewController).tableView reloadData]; 

또는 당신은 별개의 단계로 분리 할 수 ​​있습니다 :

UINavigationController *navController = (UINavigationController *) self.tabBarController.selectedViewController; 
UITableViewController *tableViewController = (UITableViewController *) navController.topViewController; 
[tableViewController.tableView reloadData]; 

상위 VC가 UITableViewController의 하위 클래스라고 가정합니다.

실제로 외부에서 .tableView 속성에 액세스하면 안됩니다.보기 컨트롤러 자체에 reloadData 메서드로 해당 동작을 캡슐화해야합니다. 모든 경우에 .tableViewreloadData을 호출한다고해도 캡슐화해야합니다. 이렇게하면 코드가 모듈화되어 (사용자와 다른 사람들이 쉽게 이해할 수있게 됨), 트랙을 따라 View Controller를 확장하고 복잡성을 쉽게 할 수 있습니다.

이 앱이 어떻게 구성되었는지 정확히 알지 못하면 알림 또는 옵저버를 사용하여 VC가 데이터를 다시로드하는 것이 더 나을 것이라고 생각합니다. UI 새로 고침이 필요한 일부 글로벌 이벤트가있는 경우 NSNotification은 코드를 멋지고 모듈화 된 상태로 유지하면서 UI 레이어에서 메시지를 가져 오는 좋은 방법입니다.

+0

굉장합니다. 코드가 작동했습니다. 나는이 메시지들을 어떻게 형변환 할 수 있는지 궁금했다. 나는'reloadData' 제안을 고려할뿐만 아니라 아마도 Shaggy Frog으로 언급 된 Notifications를 사용할 것입니다. – Andrew