0

내 루트 인 tabbarcontroller에서 내비게이션 컨트롤러 안에있는 uitableview에서 새로 고침 제어 메소드에 액세스하려고 시도했지만 정확한 핸들을 얻는 데 어려움이 있습니다. ...어떻게 응용 프로그램 대리인의 uitabbarcontroller 내부에있는 uinavigationcontroller 내부에서 uitableview에 액세스합니까?

UITableViewController *tableView = (UITableViewController *)[[self.tabbarController viewControllers][0] tableView]; 
    [tableView.refreshControl beginRefreshing]; 

이 지금까지 AppDelegate에 내 코드 만이 작동하지 않습니다 나는 내가 통해 액세스 할 수 있습니다 생각 5 탭 표시 줄의 항목이 [0], [1] 내가이만큼 깊은 액세스 모든 온라인을 찾을 수 없습니다로 [2], [3] 그리고 jQuery과 내 코드 (아마 나던 문제가 아니지만) ...

// Add Refresh Control 
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 
    [refreshControl addTarget:appDelegate action:@selector(forceDownload) forControlEvents:UIControlEventValueChanged]; 
    self.refreshControl = refreshControl; 
    [refreshControl release]; 

어떤 도움을 크게 감상 할 수있다.

+0

이것은 끔찍한 생각처럼 들립니다. 정확히 당신이 성취하고자하는 것은 무엇입니까? –

+0

GPS 위치를 가져 와서 json 파일을 다운로드하여 앱 대리인의 uitableview를 채 웁니다. 앱이 다운로드 할 때 활동 표시기가 맨 위에 애니메이션으로 나타나면 refreshControl이 일치하는지 확인하고 싶었습니다. – skeg0

답변

6

관련없는 개체간에 통신이 필요한 경우 최상의 옵션은 NSNotifications를 사용하는 것이라고 생각합니다. 이렇게하면 단일 객체 [NSNotificationCenter defaultCenter]을 사용하여 한 객체에서 다른 객체 (또는 많은 객체)로 통보를 전달할 수 있습니다.

AppDelegate 개체 (또는 다른 개체)에 특정 알림을 적용한 다음 컨트롤을 새로 고침해야 할 때 tableviewController와 함께 알림을 게시 할 수 있습니다.

애플 대리자 클래스에서

당신이 좋아하는 관찰자를 추가 할 수 있습니다 : 여기

[[NSNotificationCenter defaultCenter] postNotificationName:@"ForceDownloadNotification" 
                object:self]; 

, 나는 이름 "ForceDownloadNotification"를 사용 : 같은 tableviewController에 당신은 드 알림을 게시 할 수

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(forceDownload) 
              name:@"ForceDownloadNotification" 
              object:nil]; 

그리고 알림의 이름으로 원하는 이름을 사용할 수 있지만이 솔루션이 제대로 작동하려면 관찰을 시작할 때와 알림을 게시 할 때 같은 이름을 사용해야합니다.

Here이 주제에 대한 자습서가 있습니다.

+0

는 매력처럼 작동했습니다! 감사 – skeg0

0

당신의 목표가 진정으로 networkActivityIndicator와 새로 고침 제어를 동기화하는 것이 확실하다면, 하나의 옵션은 KVO입니다. 의 ViewController가 필요하지 않을 때의 ViewController의 viewDidAppear:에서

다음이 관찰자를 제거 할 수 있는지 확인이

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    UIApplication *application = [UIApplication sharedApplication]; 
    [application addObserver:self 
       forKeyPath:@"networkActivityIndicatorVisible" 
        options:NSKeyValueObservingOptionNew 
        context:myContext]; 

    self.refreshControl.refreshing = [application isNetworkActivityIndicatorVisible]; 
} 

뭔가를 추가 - 아마도 viewDidDisappear:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    [[UIApplication sharedApplication] removeObserver:self 
             forKeyPath:@"networkActivityIndicatorVisible" 
              context:myContext]; 
} 

지금 실제 작업

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context; 
{ 
    if (myContext == context) { 
    self.refreshControl.refreshing = [change[NSKeyValueChangeNewKey] boolValue]; 
    } else { 
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 
3

나는 Luis Es를 좋아한다. pinoza의 접근 방식은 질문에 대답하지 않습니다 그 자체는입니다.

당신이 당신의 App Delegate를위한 rootViewController 인 UINavigationController 안에 중첩 된 UITableViewController 내부의 메쏘드를 호출하기를 원한다면.먼저 우리는있는 UITableViewController와있는 navigationController (또는 서브 클래스)를 만들 : 당신의있는 UITableViewController (또는 서브 클래스)에서 다음

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// Override point for customization after application launch. 
CustomTableViewController *nuTableVC = [[CustomTableViewController alloc] initWithStyle:UITableViewStylePlain]; 
UINavigationController *nuNavController = [[UINavigationController alloc] initWithRootViewController:nuTableVC]; 
self.window.rootViewController = nuNavController; 

[self.window makeKeyAndVisible]; 
return YES; 
} 

당신에게 설치를 당신이 질문 단지처럼 refreshcontrol :

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Add Refresh Control 
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 
    [refreshControl addTarget:[[UIApplication sharedApplication] delegate] 
         action:@selector(forceDownload) 
      forControlEvents:UIControlEventValueChanged]; 
    self.refreshControl = refreshControl; 
} 

마지막으로 액세스 할 수있는 UITableViewController 인스턴스가 실제로 원하는 클래스인지 확인해야합니다. 여기에 (forceDownload) 애플리케이션 위임 :

에 만든 메서드에 대한 구현입니다.3210
- (void)forceDownload { 
NSLog(@"force download method in App Delegate"); 
UINavigationController *someNavController = (UINavigationController*)[_window rootViewController]; 

UIViewController *vcInNavController = [[someNavController viewControllers] objectAtIndex:0]; 

if ([vcInNavController isKindOfClass:[CustomTableViewController class]]) { 
    NSLog(@"it is my custom Table VC"); 
    NSLog(@"here we can stop the refresh control, or whatever we want"); 
    CustomTableViewController *customTableVC = (CustomTableViewController *)vcInNavController; 
    [customTableVC.refreshControl performSelector:@selector(endRefreshing) 
             withObject:nil 
             afterDelay:1.0f]; 
    } 
} 

나는 더 간단하기 때문에 개인적으로 NSNotificationCenter를 선호하지만, 원래 계획했던대로 개체에 액세스 할 수 없다는 것을 의미하지는 않습니다.

(예제 코드에서 요청할 경우).

감사합니다.