отправка сообщения в viewController от делегата приложения - PullRequest
1 голос
/ 07 декабря 2009

Я новичок в obj C, я из AS3.0. В основном, в этом приложении, которое я создаю, я использую applicationWillResignActive в делегате приложения, чтобы реагировать на входящий вызов. У меня есть навигационный контроллер с табличным представлением, которое просто вызывает другое представление при выборе (шаблон, предоставленный в основном в xcode) У меня есть метод в моем представлении AnotherViewController, который загружается из выбора строки. Этот метод (пока) изменит мой ярлык на «Входящий вызов». В моем applicationWillResignActive я вызываю этот метод, и он работает нормально, но я получаю досадное предупреждение о том, что UIViewController может быть не в состоянии ответить на handleIncomingCall ... но он компилируется нормально и ДОЛЖЕН отвечать на него. Как я могу избавиться от этого предупреждающего знака?

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

Извините, я пытаюсь выяснить, как отформатировать это здесь ...

Ответы [ 5 ]

0 голосов
/ 16 октября 2014

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

В 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.

0 голосов
/ 29 июня 2011

Я выполнил это.

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

#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 голосов
/ 08 декабря 2009

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

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

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

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

  2. Самое быстрое решение - это простой NSNotificationCenter пример . Проверено и работает.

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

Создание методов handleVC1, handleVC2 и т. Д. В appDelegate.

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

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

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

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

Но если эту обработку не нужно выполнять внутри каждого viewcontroller, то для handleVC1, handleVC2 и т. Д. Может быть полностью написан код в appDelegate, и он все равно может несколько адаптироваться.

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

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

0 голосов
/ 08 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...