-2

我的问题是,在ProductNoteUIButtonAction 中,我做了initWithNibName Notes Class以在Notes Class中显示popOver。我正在从中获取数据,然后将其加载到. 我得到了selectedNote并创建了ProductNote 类的对象来调用selectedNote实例方法,该方法只设置了IBOutlet ,但它的值为 nil。那是我的问题,下面是代码,请帮助我了解为什么我会遇到此类问题。我正在使用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 创建的。而且您从未展示过您的 ProductNote UIViewController 即时 productNote。因此 txtmesssagenotes 从未正确分配和初始化。

于 2012-07-20T11:56:38.150 回答
1

您是selectedNote:在视图加载之前打电话吗?

仅仅因为您使用 xib 创建了一个视图控制器并不意味着它会立即加载您的所有子视图。

解析 xib 并在第一次view请求视图控制器的属性时创建所有视图 - 这通常是在它第一次出现之前。

在那之前,所有的IBOutlet连接都将是nil.

您需要将笔记的文本存储为NSString视图控制器的属性。然后,在viewDidLoad您需要调用的任何一个内部self.txtmesssagenotes.text=self.note;-viewDidLoad在您的视图加载后自动调用,因此您可以保证到IBOutlet那时您已经设置了所有 s 。

你不应该依赖你的视图对象来存储你的应用程序的状态(在这种情况下,笔记的文本)。如果在您的视图控制器不可见时收到内存不足警告,那么您的所有视图对象都将被删除 - 只有当您的视图控制器再次可见时才会重新创建它们 - 如果您将注释字符串存储在 UITextView 中,那么它可能下次你要求它时不要在那里:) 你应该总是将数据存储在你的视图控制器的一个属性中(或者你控制的其他地方)并使用它来创建你的视图。

于 2012-07-20T11:55:12.550 回答