在viewDidLoad之外,属性为null

时间:2014-02-28 00:43:56

标签: objective-c variables properties

两个属性:

@property (retain, nonatomic) NSString *drinkType;
@property (retain, nonatomic) NSString *wheelType;

当从viewDidLoad作为self.drinkType等访问时,它们保持我期望的值。但是,从公共方法访问时

-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas;

他们是空的。这里发生了什么?

“selectedAromas”数组从另一个控制器传递给此方法。

ViewController *aromaVC = [[ViewController alloc] init];
[aromaVC updateSentenceWithSelectedAromas:selectedAromas];

ViewController.h

-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas;

@property (retain, nonatomic) NSString *drinkType;
@property (retain, nonatomic) NSString *wheelType;

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    // This is working
    NSLog(@"The drink type is:%@", self.drinkType);
}

-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas {

    // This returns null
    NSLog(@"The drink type is:%@", self.drinkType);
}

3 个答案:

答案 0 :(得分:0)

我认为你遗漏了很多东西,这让我觉得你在ObjectiveC中缺少对变量范围的一些基本理解,让我们看看这是否对你有所帮助:

首先,您的selectedAromas数组与drinkTypewheelType没有任何关系。因此将此数组传递给ViewController似乎无关紧要。

其次,在您的ViewController中,您声明了自己的drinkTypewheelType变量,因此他们无法获得其他类或控制器的值。

答案 1 :(得分:0)

您可能不会很快设置您的属性(init将是一个好地方)。 viewDidLoad稍后会根据您发布的代码进行调用。

答案 2 :(得分:0)

好的,Michael Dautermann是绝对正确的。方法updateSentenceWithSelectedAromas实际上是在视图控制器的单独实例中运行。为了解决这个问题,我用我的方法实现了一个协议监听器,并使用segue将子控制器的委托设置为它的父代。

感谢大家的帮助。

如果有人发现这件事,我就是这样做的:

ViewController2.h

@protocol updateSentenceProtocol <NSObject>

//Send Data Back To ViewController
-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas;

@end

@interface ViewController2 : UIViewController

// delegate so we can pass data to previous controller
@property(nonatomic,assign)id delegate;

@end

ViewController2.m

@synthesize delegate;

-(void)someMethod {
   [delegate updateSentenceWithSelectedAromas:selectedAromas];
}

ViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"viewController2Segue"])
    {
        // Get reference to the destination view controller
        ViewController2 *vc = [segue destinationViewController];
        vc.delegate = self;
    }
}

-(void)updateSentenceWithSelectedAromas:(NSMutableArray *)selectedAromas {
  // do stuff with array and properties as needed
}