0

基本的な継承の概念を適用しようとしています。親のtextfield.textビューコントローラーを子のビューコントローラーに表示する必要があります。しかし、私はnull値を取得しています

Parent.h

@interface EditEventViewController : UITableViewController
{
 UITextField *textEventName;
    UITextField *textEventLocation;
    UITextField *textStartTime;
    UITextField *textEndTime;
    UITextField *textDate;
    UITextField *textEndDate;

    //tried IBOutlet version  such as
    //IBOutlet UITextField *textEventName;//this didnt work too
}

@property (nonatomic, strong) IBOutlet UITextField *textEventName;
@property (nonatomic, strong) IBOutlet UITextField *textEventLocation;
@property (nonatomic, strong) IBOutlet UITextField *textStartTime;
@property (nonatomic, strong) IBOutlet UITextField *textEndTime;
@property (nonatomic, strong) IBOutlet UITextField *textDate;
@property (nonatomic, strong) IBOutlet UITextField *textEndDate;

親.m

  @synthesize textEndDate=_textEndDate;
@synthesize textDate=_textDate;
@synthesize textEndTime=_textEndTime;
@synthesize textEventName=_textEventName;
@synthesize textStartTime=_textStartTime;
@synthesize textEventLocation=_textEventLocation;

//test inherritance here
     DeleteFromCalendar *deleteControl=[[DeleteFromCalendar alloc] init];
    NSLog(@"Delete Request for text name %@",self.textEventName.text);
    [deleteControl displayParentStrings];

Child.h

#import "EditEventViewController.h"

@interface DeleteFromCalendar : EditEventViewController

-(void)displayParentStrings;

@end

Child.m

-(void)displayParentStrings
{
    NSLog(@"Display Parent Strings");
    NSLog(@"DeleteFromCalendar Event Name %@",textEventName.text);
    NSLog(@"DeleteFromCalendar  Event  %@",textEventLocation.text);
}

NSLOG:

Delete Request for text name Aeronautical Knowledge Review
DeleteFromCalendar Event Name (null)
DeleteFromCalendar  Event Lcoation (null)

null になるのはなぜですか?

4

3 に答える 3

0

カレブの答えは問題を解決しますが、それだけではありません。本当の問題は、アンダースコアのプレフィックスを使用してプロパティを合成したことです。したがって、実行しているときはtextEventName.text、プロパティで合成された変数ではなく、Parent.h で宣言したインスタンス変数にアクセスしています。ただし、インターフェイス ビルダーは、UI 要素をプロパティに割り当てるためにフックされます。したがって、それらはアンダースコアのプレフィックスを持つものに割り当てられます。したがって、アンダースコアのないインスタンス変数は nil です。したがって、次のようにコードを変更する必要があります。

Parent.h

@interface EditEventViewController : UITableViewController

// you don't need the instance variables

@property (nonatomic, weak) IBOutlet UITextField *textEventName;
@property (nonatomic, weak) IBOutlet UITextField *textEventLocation;
@property (nonatomic, weak) IBOutlet UITextField *textStartTime;
@property (nonatomic, weak) IBOutlet UITextField *textEndTime;
@property (nonatomic, weak) IBOutlet UITextField *textDate;
@property (nonatomic, weak) IBOutlet UITextField *textEndDate;

親.m

// you don't need to synthesize

//test inherritance here
    DeleteFromCalendar *deleteControl=[[DeleteFromCalendar alloc] init];
    NSLog(@"Delete Request for text name %@",self.textEventName.text);
    [deleteControl displayParentStrings];

Child.h

#import "EditEventViewController.h"

@interface DeleteFromCalendar : EditEventViewController

-(void)displayParentStrings;

@end

Child.m

-(void)displayParentStrings
{
    NSLog(@"Display Parent Strings");
    NSLog(@"DeleteFromCalendar Event Name %@", self.textEventName.text);
    NSLog(@"DeleteFromCalendar  Event  %@", self.textEventLocation.text);
}

また

-(void)displayParentStrings
{
    NSLog(@"Display Parent Strings");
    NSLog(@"DeleteFromCalendar Event Name %@", _textEventName.text);
    NSLog(@"DeleteFromCalendar  Event  %@", _textEventLocation.text);
}
于 2013-07-15T18:50:01.267 に答える
0

サブクラスの概念 (継承の概念) とクラスのインスタンスを間違えました。それらは完全に関連していません。クラスをサブクラス化すると、そのクラスに関連付けられた (いくつかの?) プロパティを継承する新しいクラスが作成されます。ここでのキーワードは、新しいクラスを作成したということです。このサブクラスの親だけでなく、任意のオブジェクトがこのサブクラスのインスタンスを作成できます。

この概念は、すべてのオブジェクト指向プログラミング言語に非常に当てはまります。Web で「サブクラスとインスタンス」を検索すると、このトピックに関する詳細な議論が見られるはずです。幸運を!

于 2013-07-17T09:34:39.420 に答える