我的问题是,在 ProductNote 类UIButton
操作中我执行了initWithNibName
Notes类以显示 popOver 在 Notes类中使用UITableView
。我从sqlite
获取数据,然后将其加载到UITableView
中的tableViewDidSelectRowAtindexPath:
。我获得了 selectedNote 并创建了 ProductNote类的对象来调用仅 IBOutlet textview.text
但是没有。多数民众赞成我的问题,下面是代码,请帮助我知道为什么我会遇到这类问题。我正在使用 Xcode 4.3.3 而不使用 ARC 。手动我在每个ViewController上定义了dealloc方法
//**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.arr注意有效对象并包含数据,并将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];
}
答案 0 :(得分:2)
正如你所说的那样,txtmesssagenotes是使用IB创建的。并且您从未展示过您的ProductNote UIViewController即时产品注释。所以txtmesssagenotes从未被正确分配和初始化。
答案 1 :(得分:1)
您是否在加载视图之前调用selectedNote:
?
仅仅因为您使用xib创建了一个视图控制器并不意味着它会立即加载所有子视图。
解析xib并在第一次要求视图控制器的view
属性时创建所有视图 - 这通常是在它第一次出现之前。
在此之前,所有IBOutlet
个关联都将是nil
。
您需要将注释的文本存储为视图控制器的NSString
属性。然后,在viewDidLoad
内部,您需要在加载视图后自动调用self.txtmesssagenotes.text=self.note;
- viewDidLoad
,这样您就可以确保在此时设置所有IBOutlet
您不应该依赖视图对象来存储应用的状态(在这种情况下,是注释的文本)。如果在视图控制器不可见时收到内存不足警告,那么所有视图对象都将被删除 - 只有当视图控制器再次可见时才会重新创建它们 - 如果您将注释字符串存储在UITextView中,那么它可能会被删除下次你要求它时不存在:)你应该总是将数据存储在视图控制器的属性中(或你控制的其他地方)并使用它创建你的视图。