2009-12-07 1 views
1

Я новичок в obj C, я исхожу из фона AS3.0. В основном в этом приложении, которое я делаю, я использую applicationWillResignActive в делегате приложения, чтобы реагировать на входящий вызов. У меня есть navigationController с табличным представлением, которое просто запускает другое представление при выборе (шаблон, представленный в основном коде xcode) У меня есть метод в моем представлении AnotherViewController, который загружается из выбора строки. Этот метод (на данный момент) изменит мой ярлык на «Call come in». В моем приложенииWillResignActive Я вызываю этот метод, и он работает нормально, но я получаю раздражающее предупреждение о том, что UIViewController, возможно, не сможет ответить на handleIncomingCall ... но он компилируется и отвечает на него. Как я могу избавиться от этого предупреждающего знака?отправка сообщения для просмотраController из делегата приложения

-(void) applicationWillResignActive:(UIApplication *)application { 
    NSLog(@"CALL COMIN IN"); 
    UIViewController *vc = [navigationController visibleViewController]; 
    [vc handleIncomingCall]; 
    [vc release]; 
} 

К сожалению, я пытаюсь выяснить, как отформатировать его здесь ...

ответ

0

Причина в том, что вы говорите, компилятор объект имеет UIViewController и handleIncomingCall действительно не метод UIViewController. Вы можете избавиться от предупреждения my, включая файл .h, и определить объект как AnotherViewController или все, что вы на самом деле вызвали его. Делегат увидит в файле .h, что handleIncomingCall - это метод этого класса, и поэтому перестанет давать вам это предупреждение.

Obj-C не является строго типизированным языком, поэтому он компилируется. Это работает, потому что, хотя вы определяете переменную как UIViewController, она фактически имеет собственный тип, который отвечает на соответствующее сообщение. Но компилятор не знает об этом во время компиляции.

+0

Привет, Спасибо за ответ. Это касается того, где я получил. Я понял, что он действительно пытался вызвать мой метод на UIViewController, поэтому я передал его в AnotherViewController. Проблема в том, что во время этого события может отображаться любое количество контроллеров представлений, а не только еще один элемент управленияViewView. Любые предложения о том, как я мог это написать? Любой способ проверить, какой тип в настоящее время виден и действовать соответствующим образом? – bmanderscheid

0

ОК, так что я делаю это:

AnotherViewController *vc = (AnotherViewController *) navigationController.visibleViewController; 
    if ([vc isKindOfClass:[AnotherViewController class]]){ 
     [vc handleIncomingCall]; 
    } 
    else{ 
     NSLog(@"NOT ANOTHER VIEW CONTROLLER DO NOTHING"); 
    } 

Это будет работать отлично подходит для этого приложения, я просто интересно, как вы бы справиться с этим, если было несколько представлений с этим методом, и вы хотели назови это. Я не думаю, что вы добавили бы кучу || в инструкцию if. Я перейду через этот мост, когда доберусь туда. Спасибо за тонну за помощь!

0
  1. Вы можете создать подкласс, чтобы дать каждому VC любые методы, которые вы любите и вызывать их с общим классом, сообщение передаются дальше вниз.

  2. Быстрое решение - это простой NSNotificationCenterexample. Протестировано и работает.

  3. Мне нужно было сделать что-то еще, поэтому я сделал это по-другому.

Создать handleVC1, handleVC2 и т. Д. Методы в appDelegate.

В представленииWillAppear в каждом диспетчере представлений, который должен отвечать, установите объект visibleID (любого вида) в appDelegate.

В приложенииWillResignActive используйте идентификатор, чтобы вызвать соответствующий метод. Они могут быть

-(void)handleVC1 {[vc1 handleIncomingCall];} 

-(void)handleVC2 {[vc2 handleIncomingCall];} 

Но если это обращение не должно быть сделано внутри каждого ViewController, handleVC1, handleVC2 и т.д. может иметь свой код, написанный в AppDelegate полностью и все еще может «адаптироваться» несколько.

Я обычно @class vc1 (и т.д.) ... IBOutlet ... добавьте и подключитесь в mainwindow.xib в любом случае.Таким образом, у меня есть 1 инициализированный объект для каждого диспетчера viewcontroller, тогда я могу делать все, что захочу, если возникнет такая необходимость. Стандартная процедура :)

Один из них должен исправить вас, я думаю.

0

Я достиг этого, выполнив это.

В приложении делегата я сделал свойство для контроллера представления

#import <UIKit/UIKit.h> 
#import "MyViewController.h" 

@interface AppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> { 

    UIViewController *myViewController; 


} 

@property (nonatomic, assign) UIViewController *myViewController; 


@end 

Затем в контроллере представления, что я хотел, чтобы получать сообщение я это сделал.

AppDelegate *theAppDelegate = (AppDelegate*) [UIApplication sharedApplication].delegate; 

theAppDelegate.myViewController = self; 

Затем я могу легко отправить сообщение viewController из делегата приложения.

Пожалуйста, дайте мне знать, если есть какие-либо проблемы с наследованием с этим ответом. Это работает для меня ...

0

Я знаю, что это старый вопрос, но это, похоже, работает на меня.

В AppDelegate.m:

#import "ViewController.h" 

- (void)applicationWillResignActive:(UIApplication *)application { 
    ViewController *viewController = (ViewController *)self.window.rootViewController; 
    [viewController test]; // Implement this in ViewController 
} 

А затем реализовать - (Недействительными) испытания; в ViewController (не забудьте добавить его в ViewController.h тоже)

- (void)test 
{ 
    NSLog(@"Test Successful"); // If all goes well, this will be printed when app resigns being active 
} 

Это лишь простой пример того, как отправлять сообщения в контроллер представления, откуда вы можете отправить сообщение дальше к другим Экземпляры UIViewController.

Смежные вопросы