访问其他类中的变量时的空值(组合导航和选项卡控制器)

时间:2012-03-05 19:58:24

标签: iphone objective-c ios xcode

我有一个驻留在标签栏控制器内的导航控制器,每当我尝试从导航控制器中的类访问一个类时,我的所有值都返回(null)。

这就是我尝试这样做的方式。

AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate> {
NSString *searchQueryA;
}

@property (strong, nonatomic) NSString *searchQueryA;

ThirdViewController.h

#import "MasterViewController.h"
#import "AppDelegate.h"

@class MasterViewController;

@interface ThirdViewController : UIViewController {
code
}

@property (strong, retain) MasterViewController *masterViewController;

ThirdViewController.m

- (IBAction)showDetail:(id)sender {
AppDelegate *appDelegate = [[AppDelegate alloc] init];
appDelegate.searchQueryA = _searchField.text;
masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
[self.navigationController pushViewController:masterViewController animated:YES];
}

MasterViewController.h

#import "AppDelegate.h"
@interface MasterViewController : UITableViewController
{
NSString *searchQueryM;
}

@property (nonatomic, strong) NSString *searchQueryM;

MasterViewController.m

 AppDelegate *appDelegate = [[AppDelegate alloc] init];
 searchQueryM = appDelegate.searchQueryA;

 NSLog(@"%@", searchQueryM);

在日志中我可以看到searchQueryM是(null)。如果我尝试从另一个类访问AppDelegate中的变量,这与导航控制器没有关系,那么它显示完全正常。我错过了什么?

如果您需要查看更多代码,我很乐意提供。

编辑:

为了便于阅读,我将在此处发布代码更改:

我的AppDelegate.h中有委托

正如莱昂纳多指出的那样,我只分配并初始化了我的AppDelegate。我把那个片段改成了这个:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
searchQueryM = appDelegate.searchQueryA; 

但仍然没有,因为searchQueryM仍然是(null)。

这就是我对searchQueryM

的处理方式

MasterViewController.h

@interface MasterViewController : UITableViewController
{
NSString *searchQueryM;
}

@property (nonatomic, strong) NSString *searchQueryM;

MasterViewController.m

@synthesize searchQueryM;

我对Objective-C(以及OO编程)相当新,应该读一本关于它的书,但在我看来,它并没有比这更多的东西。如果我错了,请纠正我。

编辑2

ThirdViewController.h

@interface ThirdViewController : UIViewController {
UITextField *_searchField;
}

@property (nonatomic, strong) IBOutlet UITextField *searchField;

ThirdViewController.m

 @synthesize searchField = _searchField;

 ...

 - (IBAction)showDetail:(id)sender {
 _code_
 NSLog(@"%@", searchField.text);
 _code_

如果我在searchField文本字段中输入“asd”并输出日志,我会得到“asd”。      }

1 个答案:

答案 0 :(得分:1)

为什么要为你的AppDelegate分配init? 应通过以下方式访问AppDelegate:

[[UIApplication sharedApplication] delegate]

我们应该看看你通常如何初始化searchQueryM,你得到null,可能是因为AppDelegate只获得了分配和init,但初始化其属性的逻辑永远不会被调用。