-2

这个问题困扰了我一晚上,没有任何意义。这个函数返回它应该返回的任何东西。例如,问题名称。

-(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;
}

让我觉得很脏。但它现在必须做,我可以继续。如果有人能想到解决方案,请告诉。对不起我的好斗,听到人们说‘这到底是什么?什么是问题名称??伊瓦尔??当它真的隐含在问题中时。

4

3 回答 3

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];

IfissueName是一个属性(而你没有@sythesized其他任何东西)它的表示应该是_issueName.

上面的修复或多或少只是让代码更简洁。问题可能与viewDidLoad:(见下文)中的代码有关。


现在您可以初始化您的Issue对象,并使用以下代码显示问题名称:

// Init:
Issue *myIssue = [[Issue alloc] initWithIssue:@"Example Issue"];
// Log:
NSLog(@"%@", myIssue.issueName);

日志应显示:

Example Issue

于 2013-01-05T02:09:02.703 回答
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

你从上面的代码中得到了什么?

于 2013-01-05T01:52:30.720 回答
0

我觉得这有点奇怪。你打电话[super initWithNibName:nil bundle:nil]。这让我相信这可能是NSViewController. 如果你像这样初始化NSViewController,除非有其他一些非常非标准的东西,-viewDidLoad否则可能不会被调用,因为没有要加载的 NIB(因为你传递nil给 super)。但显然你正在设置一个断点,-viewDidLoad所以它被调用(在某些东西上)。这让我觉得您在某个 XIB 中将此类指定为文件所有者或作为 NIB 加载的自定义对象。如果是这种情况,它会让我相信您正在初始化的实例和-viewDidLoad正在调用的实例不是同一个实例。NSLog(@"self: %p", self);

如果正在调用的实例-viewDidLoad是 NIB 加载的,那么您的 init 方法将不会被调用。相反,它将使用-initWithCoder

如果您可以详细说明此处的情况(即如何实例化,是否涉及任何 XIB 等),我将编辑我的答案以提供更多帮助,但我认为这里没有足够的信息来真正提供帮助。

我感觉到你的沮丧。假设标准行为,这里的任何建议都应该有效。这只会加强我的怀疑,即这些不是同一个实例(在-initWithIssue-viewDidLoad.

于 2013-01-05T15:04:10.160 回答