-2

私の問題は、ProductNoteクラスUIButtonActionで、 Notes Class でpopOverを表示するためにNotes ClassinitWithNibName 実行したことです。からデータをフェッチしてからロードしています。selectedNoteを取得し、ProductNote クラスのオブジェクトを作成して、 IBOutletのみを設定し、nilを設定するselectedNoteインスタンス メソッドを呼び出します。それが私の問題です。以下は、このタイプの問題に直面する理由を知るのに役立つコードです。Xcode 4.3.3を使用しており、 ARCは使用していません。すべての ViewController で手動で dealloc メソッドを定義しましたUITableViewsqliteUITableViewtableViewDidSelectRowAtindexPath: textview.text

//**ProductNote.h Class****************************
#import <UIKit/UIKit.h>
@class Notes;
@interface ProductNote : UIViewController<UIPopoverControllerDelegate>
{
UIPopoverController *popOverController;
UITextView *txtmesssagenotes;
Notes *objNotes;
}
@property (retain, nonatomic) IBOutlet UITextView *txtmesssagenotes; //It is Connected to ProductNote.xib
@property (retain,nonatomic)  UIPopoverController *popOverController; 
@property (retain,nonatomic)  Notes *objNotes;
-(IBAction)presentPopOver:(UIButton*)sender;
 -(void)selectedNote:(NSString*)note;
@end

//ProductNote.m Class
@implementation ProductNote
@synthesize txtmesssagenotes,popOverController,objNotes;

-(IBAction)presentPopOver:(UIButton*)sender
{
self.objNotes=[[Notes alloc]initWithNibName:@"Notes"bundle:nil];
UIPopoverController *popOver=[[[UIPopoverController alloc]initWithContentViewController:objNotes]autorelease];
self.popOverController=popOver;
self.popOverController.delegate=self;
self.popOverController.popoverContentSize=objNotes.view.frame.size;
CGRect rect=[self.view convertRect:objNotes.view.frame fromView:self.view];
rect.origin.y+=110;
rect.origin.x+=23;
[self.popOverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:0 animated:YES];
 //Then I get popOver with tableview 
}
-(void)selectedNote:(NSString*)note
{
 self.txtmesssagenotes.text=note;     
 //Here I am getting txtmesssagenotes=0X0 or nil. Using self or without self Please tell me the reason.
}
- (void)dealloc {
[txtmesssagenotes release];
[popOverController release];
[objNotes release];
[super dealloc];
}
@end

@interface Notes : UITableViewController
{
NSMutableArray *arrNotes;
NSString *selectedNote;
UITableView *tblNotes;
}
@property(nonatomic,retain)NSMutableArray *arrNotes;
@property(nonatomic,retain)NSString *selectedNote;
@property(nonatomic,retain)IBOutlet UITableView *tblNotes;
@end

//Actually I skip the other methods that makes larger program to read . other methods only    used to fetch data from sqlite and fill up the arrNotes that is used to fill all rows in the  tableview. 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 self.selectedNote=[self.arrNotes objectAtIndex:indexPath.row];

// ここで self.arrNotes の有効なオブジェクトであり、データを含み、NSString オブジェクトを self.selectedNote に割り当てます

ProductNote *productNote=[[ProductNote alloc]init];
[productNote selectedNote:self.selectedNote]; //after calling selectedNote i goto to selectedNote implementation or definition above.
[productNote release];

}
-(void)dealloc
{
[arrNotes release];
[selectedNote release];
[tblNotes release];
[super dealloc];
}
4

2 に答える 2

2

あなたが言ったように、txtmesssagenotesはIBを使用して作成されたからです。また、ProductNoteUIViewControllerインスタントproductNoteを提示したことはありません。そのため、txtmesssagenotesが正しく割り当てられ、初期化されることはありませんでした。

于 2012-07-20T11:56:38.150 に答える
1

selectedNote:ビューが読み込まれる前に呼び出していますか?

xib を使用してビュー コントローラーを作成したからといって、すべてのサブビューがすぐに読み込まれるわけではありません。

ビュー コントローラーのviewプロパティが初めて要求されたときに、xib が解析され、すべてのビューが作成されます。これは通常、初めて表示される直前です。

それまでは、すべてのIBOutlet接続はnil.

NSStringメモのテキストをView Controllerのプロパティとして保存する必要があります。次に、いずれかの内部viewDidLoadで呼び出す必要がありますself.txtmesssagenotes.text=self.note;-viewDidLoadビューがロードされた直後に自動的に呼び出されるため、それまでにすべてのIBOutlets が設定されていることが保証されます。

アプリの状態 (この場合はメモのテキスト) を保存するために、ビュー オブジェクトに依存しないでください。ビュー コントローラーが表示されていないときにメモリ不足の警告が表示された場合、すべてのビュー オブジェクトが削除されます。それらは、ビュー コントローラーが再び表示されるようになったときにのみ再作成されます。メモ文字列を UITextView 内に保存している場合は、次回要求するときはありません:)常にビューコントローラーのプロパティ(または制御する他の場所)にデータを保存し、それを使用してビューを作成する必要があります。

于 2012-07-20T11:55:12.550 に答える