-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: Nothing で「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);
}

私は次のようにView Controllerを呼び出しています:

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とは?? イヴァル??」それが質問に本当に暗黙のうちにあったとき。

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

issueNameがプロパティである場合(そして@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と、他のかなり非標準的なものを除いて、ロードするNIBがないため(スーパー-viewDidLoadに渡したため)、おそらく呼び出されません。nilしかし、明らかにブレークポイントを設定して-viewDidLoadいるので、(何かで) 呼び出されています。これは、ファイルの所有者または NIB でロードされたカスタム オブジェクトとして、どこかの XIB でこのクラスが指定されていると思います。もしそうなら、あなたが初期化しているインスタンス-viewDidLoadと呼び出されているインスタンスは同じインスタンスではないと私は信じるようになります。NSLog(@"self: %p", self);

呼び出しを取得しているインスタンス-viewDidLoadが NIB ロードされている場合、init メソッドは呼び出されません。代わりに使用します-initWithCoder

ここで状況を詳しく説明できる場合 (つまり、これがどのようにインスタンス化されているか、XIB が含まれているかなど)、回答を編集してより多くのヘルプを提供しますが、ここには本当に役立つ十分な情報がないと思います。

私はあなたの欲求不満を感じます。標準的な動作を想定すると、ここでの提案はどれも機能するはずです。これは、これらが同じインスタンスではないという私の疑いを補強するだけです( と の間-initWithIssue-viewDidLoad

于 2013-01-05T15:04:10.160 に答える