Вызов функции в viewcontroller из appdelegate

#iphone #objective-c #ios

#iPhone #objective-c #iOS

Вопрос:

Я хочу вызвать функцию в ViewController из моего AppDelegate, но со следующим кодом она не вызывается. Что я делаю не так?

AppDelegate.h:

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

@class AccountDetailTransferViewController;

@interface AccountDetailTransferAppDelegate : NSObject <UIApplicationDelegate> {

    DetailsToTransfer *objDetailsToTransfer;
}

@property (nonatomic, retain) DetailsToTransfer *objDetailsToTransfer;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet AccountDetailTransferViewController *viewController;

-(void)sendToTransferScreen:(NSArray *)detailsArray;

@end
  

AppDelegate.m:

 ....
-(void)sendToTransferScreen:(NSArray *)detailsArray {


    [objDetailsToTransfer setLabels:detailsArray];

    objDetailsToTransfer = [[DetailsToTransfer alloc]initWithNibName:@"DetailsToTransfer" bundle:nil];

    [self.window addSubview:objDetailsToTransfer.view];

}
  

DetailsToTransfer.h:

 #import <UIKit/UIKit.h>

@interface DetailsToTransfer : UIViewController {
    NSArray *accountDetailsArray;
    UILabel *nameLabel;
    UILabel *accountLabel;
    IBOutlet UIButton *btnTransfer;
    IBOutlet UIButton *btnBack;
}

@property (nonatomic, retain) NSArray *accountDetailsArray;
@property (nonatomic, retain) IBOutlet UILabel *nameLabel;
@property (nonatomic, retain) IBOutlet UILabel *accountLabel;

-(IBAction)sendDetails;
-(IBAction)goBack;
-(void)setLabels:(NSArray *)array;

@end
  

DetailsToTransfer.m

 ....
-(void)setLabels:(NSArray *)array {

    NSLog(@"Setting Labels");

    self.nameLabel.text = [array objectAtIndex:0];
    self.accountLabel.text = [array objectAtIndex:1];
}
....
  

Я хотел бы добавить, что все свойства были синтезированы и что я правильно вызываю метод в AppDelegate (я проверил с помощью NSLogs)

Комментарии:

1. Вы пытаетесь вызвать setLabels метод?

2. Вы пытались вызвать setLabels после создания объекта.. вы вызываете метод для нераспределенного объекта.

3. ..вы также должны создать объект таким образом, если хотите его сохранить: self.objDetailToTransfer=..etc

Ответ №1:

В AppDelegate.m:

Похоже, что вы вызываете метод для своего объекта до того, как объект был создан. Пока вы не выделите / не инициализируете свой объект, не будет никаких меток для установки текста.

Комментарии:

1. что ж, теперь он переходит к функции в ViewController и получает правильные передаваемые данные, но метки не устанавливаются, потому что при загрузке представления в метках ничего нет… Я также NSLogged значения, и они возвращают (null)… Что я делаю не так?

2. При вызове setLabels ваша программа будет выполняться с помощью метода, но метки и self остаются nil неизменными до тех пор, пока вы не создадите объект. Вы увидите протоколирование, но это все. Когда вы выделяете и инициализируете свой объект, self теперь будет объектом DetailsToTransfer класса, а метки будут созданы из xib.

Ответ №2:

Попробуйте изменить свой метод на этот:

 -(void)sendToTransferScreen:(NSArray *)detailsArray {

     if (!objDetailsToTransfer) {

         objDetailsToTransfer = [[DetailsToTransfer alloc]initWithNibName:@"DetailsToTransfer" bundle:nil];

         [objDetailsToTransfer setLabels:detailsArray];

         [self.window addSubview:objDetailsToTransfer.view];

    }
}
  

Проблема может заключаться в том, что вы пытаетесь установить значения для объекта, который еще не создан. Я также предоставил оператор if, чтобы предотвратить многократное создание объекта.