-1

私はTableViewControllerを作ろうとしています..YouTubeのレッスン「Cocoa Programming L13-14」のコードを使用して動作させましたが、デフォルト値がハードコーディングされないように変更しようとすると...しかしInterface Builder のコントロールの値ではなく、全面的に (null) を取得します。コードは次のとおりです。

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    IBOutlet NSPathControl* pcSource;
    IBOutlet NSPathControl* pcDestination;
    IBOutlet NSTextField* tfBackupAmount;

    NSURL* urlSource;
    NSURL* urlDestination;
    NSString* strBackupAmount;

    //Old--
    //NSString* name;
    //int age;
}

@property NSURL* urlSource;
@property NSURL* urlDestination;
@property NSString* strBackupAmount;

//Old--
//@property (copy) NSString* name;
//@property int age;

@end

#import "Person.h"

@implementation Person

@synthesize urlSource;
@synthesize urlDestination;
@synthesize strBackupAmount;

//Old--
//@synthesize name;
//@synthesize age;

- (id)init {
    self = [super init];
    if (self) {
        urlSource = [pcSource URL];
        urlDestination = [pcDestination URL];
        strBackupAmount = [tfBackupAmount stringValue];
        NSLog(@"%@\n%@\n%@",urlSource,urlDestination,strBackupAmount);

        //Old--
        //name = @"Yoda";
        //age = 900;
        //NSLog(@"%@: %i", name, age);
    }
    return self;
}
@end

コメントされたすべての //Old-- が機能し、TableViewController と正常にやり取りしました。したがって、すべてがまだ正常に機能していると思います。3 つのコントロール (2 つの NSPathControl と 1 つの NSTextField) は、コントロールがリンクされた Interface Builder の Object クラス:Person にリンクされています。次の出力が得られるのはなぜですか:

(null)
(null)
(null)

? NSLog(); に到達したとき。ライン?どこが間違っていますか?ありがとう!

4

3 に答える 3

1

pcSourcepcDestination、またはメソッドが呼び出されtfBackupAmountたときに初期化されないinitため、それらはすべてnil. にメッセージを送信することnilは Objective-C では合法であり、ただnil戻ってきます。つまりurlSourceurlDestination、 、およびstrBackupAmountも同様nilです。そのため、表示されているログ出力を取得できます。

これらの変数が初期化された後、ログ メッセージをいつかに変更する必要があります。

于 2013-09-18T20:18:30.947 に答える
0

コードを -init ではなく -viewDidLoad に入れてみてください。それはすべて、イベントの順序に関係しています (-init は、IB が発生する前に呼び出されます。

于 2013-09-18T20:18:41.350 に答える
0

わかりました、技術的にはこの質問 - 私はそれに対する答えを見つけました。カスタムのinitメソッドを作ることです。私の場合、これは次のことを意味します。

Person* p = [[Person alloc] initWithurlSource:[NSURL URLWithString:@"moo"] andurlDestination:[NSURL URLWithString:@"cow"] andstrBackupAmount:@"foo"];

ただし、これでも、@property として公開されている別のクラス (この場合は TableViewController クラス) から IBOutlets の値を取得するという問題は解決しません。

@interface AppDelegate : NSObject <NSApplicationDelegate> {
.....
.....
@property (nonatomic, retain) NSPathControl* pcSource;
@property (nonatomic, retain) NSPathControl* pcDestination;
@property (nonatomic, retain) NSTextField* tfBackupAmount;

「addButtonPressed」メソッドでこれらのコントロールの値を取得するのにまだ問題があります。

//ad is AppDelegate - declared in interface as AppDelegate* ad;
NSPathControl* pcSource = [ad pcSource];
NSPathControl* pcDestination = [ad pcDestination];
NSTextField* tfBackupAmount = [ad tfBackupAmount];
于 2013-09-19T02:22:11.243 に答える