gpt4 book ai didi

ios - 如何访问 iOS 中动态传递给子 viewController 的参数?

转载 作者:行者123 更新时间:2023-11-29 04:14:37 25 4
gpt4 key购买 nike

我有一个 viewController,它有一个按钮,单击该按钮时,会动态创建对另一个 viewController 类的引用,并在此过程中设置该 的参数>viewController 也是如此。我在 for 循环中执行此操作,如下所示:

-(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 值为 nil,并且我的 viewController 标题没有显示任何内容。

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

最佳答案

一个常见的错误是在 View Controller 中有一个接口(interface),您要转换到该接口(interface)以具有如下接口(interface):

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

你真正应该做的是消除显式声明的 ivar,因此 @interface看起来像:

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

然后省略 @synthesize完全声明或有一个看起来像这样的声明:

@synthesize personName = _personName;

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

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

或者您可以使用实例变量(ivar):

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

(顺便说一句,通常建议在 setting properties 时使用访问器(例如 self.personName )。唯一真正必须使用 ivar (例如 _personName )的时间是在 initializer methods and dealloc 中。)

但是,最重要的是,不要显式定义实例变量,让编译器为您合成它,从而消除此类问题。建议使用前导下划线合成 ivar,以最大程度地减少当您真正打算使用属性的访问器方法时意外使用 ivar。

参见Practical Memory Management高级内存管理编程指南中了解更多信息。

关于ios - 如何访问 iOS 中动态传递给子 viewController 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13899044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com