【发布时间】:2014-05-27 22:33:55
【问题描述】:
我在 Objective-C 中两个 UIViewControllers 之间的委托遇到了麻烦。
我在其中一个UIViewControllers 中创建了代表,它与前一个UIViewController 对话。我在ConfirmDetailsViewController 中声明了代表。 (这是在viewDidLoad 中声明的,以及其他委托代码):
ForthViewController *delegate = [[ForthViewController alloc] init];
我还在.m 文件的@interface 上方添加了正确的#import "ForthViewController.h"。
后面几行我将一组本地属性NSStrings 设置为delegate.nameString 的值,这是ForthViewController 中的另一组属性NSStrings,如下所示:
self.nameString = delegate.nameString;
self.emailAddressString = delegate.emailAddressString;
self.phoneNumberString = delegate.phoneNumberString;
self.emergencyPhoneNumberString = delegate.emergencyPhoneNumberString;
self.additionalDonationString = delegate.additionalDonationString;
然后我继续使用NSLog 将self.nameString、self.emailAddressString 等的值打印到控制台:
NSLog(@"Name: %@", self.nameString);
NSLog(@"Email Address: %@", self.emailAddressString);
NSLog(@"Phone Number: %@", self.phoneNumberString);
NSLog(@"Emergency Phone Number: %@", self.emergencyPhoneNumberString);
NSLog(@"Donation: $%@", self.additionalDonationString);
在ForthViewController中将本地属性对象的值赋值给self.nameString等之后,我将它们的值打印到控制台并得到合适的值。然后,当我将对象转移到 ConfirmDetailsViewController 时,我遇到了所有字符串的 (null) 值。
我认为最有可能的错误在于代理在ConfirmDetailsViewController 中的声明方式,但是我在网上看到多个消息来源说这是您设置代理的方式。如何在不丢失它们的值并重置为 null 的情况下正确地通过委托获取正确的值?
如果您对我的解释有疑问,这里有一个示例项目的下载链接,该问题很明显:https://www.dropbox.com/sh/66x89dciu4waxyd/AADdA3ehUglWIDWZGzG08zqpa
编辑
对于那些想知道的人,这就是我在ForthViewController 的.h 文件和ConfirmDetailsViewController 的.h 文件中声明NSString 属性的方式:
@property (strong, nonatomic) NSString *nameString;
@property (strong, nonatomic) NSString *emailAddressString;
@property (strong, nonatomic) NSString *additionalDonationString;
@property (strong, nonatomic) NSString *phoneNumberString;
@property (strong, nonatomic) NSString *emergencyPhoneNumberString;
【问题讨论】:
-
所以
ForthViewController出现在屏幕上,然后出现ConfirmDetails,对吗?如果是这样,你如何呈现ConfirmDetails? -
@user3386109 先显示
ForthViewController,然后再显示ConfirmDetailsViewController。 -
您正在创建一个 ForthViewController 实例作为 viewDidLoad 中的局部变量,这意味着一旦 viewDidLoad 退出,视图控制器就会被释放。你实际上需要你的委托是一个属性,它的值是在 ForthViewController 调用 ConfirmDetailsViewController 时分配的。这也不是委托模式,因为委托有一个对象调用另一个对象的方法,通常是为了响应事件 - 例如考虑 UITableViewDelegate。
标签: ios objective-c uiviewcontroller delegates