2012-12-16 30 views
0

我有一个viewController,它有一个按钮,当点击该按钮时,它会动态地创建对另一个viewController类的引用,并且在该过程中也为该设置设置参数viewController。我对循环做这个里面如下:如何访问一个动态传递给iOS中的子viewController的参数?

-(void) clickOnButton:(id)sender { 


    for (PersonObject *checkPerson in [DataModel sharedInstance].personList) { 

     if (((UIControl*)sender).tag == checkPerson.personID) { 

      ParentViewController *parentView = [[NSClassFromString(checkPerson.childViewController) alloc] init]; 
      parentView.personName = checkPerson.name; 
      NSLog(parentView.personName); 
      [self.navigationController pushViewController:parentView animated:YES]; 


     } 

    } 

} 

在时生成的的viewController和该用户发送到,我有下面的代码在我viewDidLoad方法:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    NSLog(@"Hello %@", personName); 
    UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, 150, 35)]; 
    [title setCenter:CGPointMake(self.view.frame.size.width/2, 27)]; 
    [title setBackgroundColor:[UIColor clearColor]]; 
    [title setTextAlignment:NSTextAlignmentCenter]; 
    [title setFont:[UIFont boldSystemFontOfSize:15]]; 
    [title setText:personName]; 
    [self.view addSubview:title]; 

} 

当我运行我的代码,第一个viewController为我提供了personName参数的NSLog的正确输出,但是,第二个viewController语句中的方法viewDidLoad中的NSLog()显示我的personName值为零,并且没有任何显示为我的viewController的标题。

参数personName的类型为NSString,并且在父级viewController类以及子viewController类(有几个viewController类扩展了这一个父级)中都可以找到。我如何动态创建子viewController对象,并让它捕获使用父级viewController发送给它的正确参数值?

+0

它被宣布为(非原子,保留) – syedfa

+0

作为旁白(与你的问题无关),我注意到你宣布你的财产为'retain'。如果你使用ARC,你应该用'strong'替换'retain'。如果你没有使用ARC,那么你的代码可能有泄漏,因为当你''''''''''''''''ParentViewController''时,你应该也可以'autorelease'。 – Rob

回答

1

一个常见的错误是在视图控制器的接口,你转变有哪些等的接口:

@interface MyViewController : UIViewController 
{ 
    NSString *personName; 
} 
@property (nonatomic, retain) NSString *personName 
@end 

,然后实现,要么没有明确合成personName或一个有一个@synthesize声明,如:

@implementation MyViewController 

@synthesize personName = _personName; 

// the rest of the implementation 

@end 

注意,如果你没有一个明确的声明@synthesize声明,它会自动合成personName像上述声明。

这个相当无害的码位是有问题的,因为你会实例变量,一个叫personName,另一个,这是为你合成的,这就是所谓_personName结束。

你真正应该做的是消除显式声明伊娃,因此@interface会是什么样子:

@interface MyViewController : UIViewController 
@property (nonatomic, retain) NSString *personName 
@end 

,然后要么完全忽略@synthesize陈述或者有一个看起来像:

@synthesize personName = _personName; 

然后,您的代码可以通过其访问器引用属性,例如

NSLog(@"Hello %@", self.personName); 

或者你可以使用实例变量(伊娃):

NSLog(@"Hello %@", _personName); 

(顺便说一句,这是一般建议使用的访问者(如self.personName)时setting properties唯一一次你真的。必须使用伊娃(例如_personName)在initializer methods and dealloc。)

但是,底线,不要明确定义一个实例变量,让编译器为你合成它,消除这类问题。建议综合ivar与领先的下划线,以最大限度地减少意外使用ivar时,如果你真的打算使用属性的访问器方法。

有关更多信息,请参见高级内存管理编程指南中的Practical Memory Management

+0

感谢Rob的回复。你确实帮我找到了解决方案。由于该参数已在Parent类中声明,因此我不需要在子类中再次声明。在注释掉子类中参数的声明后,该值成功通过。再次感谢您的帮助,以及上面关于使用strong vs retain的评论。 – syedfa

相关问题