这一直困扰着我,这没有任何意义。此函数返回它应该的任何内容。 EG,issueName。
-(id)initWithIssue:(NSString *)string {
self = [super initWithNibName:nil bundle:nil];
if (self) {
NSString *thing = string;
issueName = [[NSString alloc]initWithString:thing];
NSLog(@"The issue name = %@", issueName);
}
return self;
}
但是,如果我尝试在viewDidLoad中访问'issueName':没有,无论我做什么,它都等于null。我已经尝试过清洁,设置自定义设置器,在属性或Ivar等之间切换。令人气愤的是,这个字符串在程序的这一点上消失了。
到底发生了什么,这真是令人生气。
修改
这是相关的整个代码。我是如何开始的。
点h文件:
@interface BFPaidAreaViewController : UITabBarController <BFNewsTableViewControllerDelegate> {
NSString *issueName;
}
-(id)initWithIssue:(NSString *)string;
点m文件:
-(id)initWithIssue:(NSString *)string {
self = [super init];
if (self) {
// PLPiper I had it that way before, because I was fiddling out of frustration
issueName = [[NSString alloc] initWithString:string];
NSLog(@"This is Called, the issue name is equal to = %@", issueName);
}
return self;
}
-(void)viewDidLoad {
[super viewDidLoad];
NSLog(@"The issue = %@", issueName);
}
我正在调用视图控制器:
BFPaidAreaViewController *pavc = [[BFPaidAreaViewController alloc]initWithIssue:@"test"];
这将记录:
This is Called, the issue name is equal to = test
The issue = (null)
新修改
发现问题。这是一个UITableViewController。奇怪的是,当我将它的类更改为UIViewController时,它可以工作。这是一个错误还是只是正常行为?但更紧迫的是,如何绕过这个限制?
(只是为了解释我在UI方面做了什么,UITabBarController在一个模态视图中。这对UIViewController很好。)
上帝可怕的修复
-(id)initWithIssue:(NSString *)string {
self = [super initWithNibName:nil bundle:nil];
if (self) {
NSString *thing = string;
issueName = [[NSString alloc]initWithString:thing];
NSLog(@"The issue name = %@", issueName);
}
[self viewDidLoad];
return self;
}
让我觉得很脏。但它现在必须要做,我可以继续。如果有人能想出解决方案,请告诉我。对于我的活力感到抱歉,听到人们说'这到底是什么?'令人难以置信的沮丧?什么是issueName?伊娃?“什么时候它真的隐含在问题中。
答案 0 :(得分:1)
好的,首先,替换:
self = [super initWithNibName:nil bundle:nil]; // Unneeded nil arguments
使用:
self = [super init]; // Equivalent method, less processing involved.
其次,替换:
NSString *thing = string;
issueName = [[NSString alloc]initWithString:thing];
只是:
_issueName = [[NSString alloc] initWithString:string];
如果issueName
是一个属性(而你还没有@sythesized
),则其表示应为_issueName
。
上述修复或多或少只是让代码更简洁。问题可能在于viewDidLoad:
中的代码(见下文)。
现在您可以初始化Issue
对象,并使用以下代码显示问题名称:
// Init:
Issue *myIssue = [[Issue alloc] initWithIssue:@"Example Issue"];
// Log:
NSLog(@"%@", myIssue.issueName);
日志应显示:
Example Issue
答案 1 :(得分:0)
将issueName设为属性,例如
@property (strong, nonatomic) NSString *issueName;
然后像这样使用它,
-(id)initWithIssue:(NSString *)string {
self = [super initWithNibName:nil bundle:nil];
if (self) {
NSLog(@"The string = %@", string);
self.issueName = string;
NSLog(@"The issue name = %@", issueName);
}
return self;
}
如果您使用的是自动合成属性(即没有手动为issueName声明@synthentize),那么您的iVar将被称为_issueName而不是issueName
你从上面的代码中得到了什么?
答案 2 :(得分:0)
我觉得这有点好奇。你打电话给[super initWithNibName:nil bundle:nil]
。这让我相信这可能是NSViewController
的子类。如果你这样初始化一个NSViewController
,除了一些非常非标准的东西,-viewDidLoad
可能不会被调用,因为没有要加载的NIB(因为你通过了nil
超)。但显然你在-viewDidLoad
中设置一个断点,所以它被调用(在某些东西上)。这使我认为您在XIB中将此类指定为文件所有者或加载NIB的自定义对象。如果是这种情况,则会让我相信您正在初始化的实例和被调用-viewDidLoad
的实例不是同一个实例。您可以通过在每种方法中加入NSLog(@"self: %p", self);
并查看它们是相同还是不同来为自己确认。
如果正在调用-viewDidLoad
的实例已加载NIB,则不会调用您的init方法。相反,它将使用-initWithCoder
如果您可以详细说明这里的情况(即如何实例化,是否涉及任何XIB等),我将编辑我的答案以提供更多帮助,但我认为这里没有足够的信息真的很有帮助。
我感到沮丧。假设标准行为,这里的任何建议都应该有效。这只会加强我的怀疑,即这些不是同一个实例(在-initWithIssue
和-viewDidLoad
之间。