2012-07-20 19 views
-2
調用另一個類initWithNibName和回下課

我的問題是,在ProductNoteUIButton動作我做initWithNibName票據類展現酥料餅用在註釋類UITableView。我從sqlite獲取數據,然後將其加載到UITableViewtableViewDidSelectRowAtindexPath:。我得到了selectedNote並創建ProductNote類的對象調用selectedNote實例方法只設置IBOutlet中的textview.text但其零。這就是我的問題,下面是代碼,請幫助我知道爲什麼我面臨這種類型的問題。我使用Xcode的4.3.3,而不是使用ARC。手動我在每個定義的ViewController dealloc方法IBOutlet中的UITextView是零的使用方法

//**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]; 
} 
+0

爲什麼我失去2個聲譽????????????? – 2012-07-20 11:36:03

+0

由於您問題頂部的文本沒有任何標點符號,閱讀起來很糟糕 - 請嘗試放入換行符和/或段落:) – deanWombourne 2012-07-20 11:49:54

+0

供參考:如果您要創建UIViewController子類,請將其稱爲'somethingViewController' - 閱讀你的代碼的方式會更快地理解它:)例如'ProductNote' =>'ProductNoteViewController' – deanWombourne 2012-07-20 12:52:27

回答

1

是您在視圖加載之前調用selectedNote:

僅僅因爲你用xib創建了一個視圖控制器並不意味着它會立即加載所有的子視圖。

xib被解析,所有視圖都是在視圖控制器的view屬性第一次被請求時創建的 - 這通常是在它第一次出現之前。

在此之前,所有IBOutlet連接將是nil

您需要將筆記的文本存儲爲您的視圖控制器的NSString屬性。然後,在viewDidLoad之內,您需要撥打self.txtmesssagenotes.text=self.note; - viewDidLoad會在您的視圖加載完畢後自動調用,因此您保證您的所有IBOutlet都已設置。

您不應該依賴您的視圖對象來存儲應用程序的狀態(在本例中爲註釋的文本)。如果收到內存不足的警告,而您的視圖控制器是不可見的,那麼所有您的視圖對象將會被刪除 - 如果你存儲一個UITextView內的音符串,那麼它可能 - 他們將只在您的視圖控制器再次變得可見重建在下一次請求時,不會存在:)您應該始終將數據存儲在視圖控制器(或您控制的其他位置)的屬性中,並使用它創建視圖。

+0

感謝您的回答,但我正在使用initWithNibName加載Notes類,然後將其添加到popOverController。你能否請你理解我的問題,我也評論過,請檢查。 – 2012-07-20 12:00:16

+0

你的問題(你_still_沒有格式化以便於閱讀)是__why是self.txtmesssagenotes nil?__。 txtmessagenotes在'ProductNote'類中,您可以使用[[ProductNote alloc] init];(從您問題中的最後一段代碼中獲取)創建該類。你爲什麼期望它來自xib? – deanWombourne 2012-07-20 12:08:54

+0

爲什麼是self.txtmesssagenotes零?是的,這是我的問題。 txtmesssagenotes是正在顯示的ProductNote的IBoutlet。我在Notes class didselectrowatindexpath中克里特productNote類對象只調用selectedNote並設置txtmesssagenotes.text。 – 2012-07-20 12:16:39

2

這是因爲正如你所說txtmesssagenotes是使用IB創建的。而且您從未展示過您的ProductNote UIViewController即時產品注。所以txtmesssnotes從未被正確分配和初始化。

+0

在顯示產品註釋類視圖後沒有實際顯示。有一個UiButton點擊它我在彈出窗口中加載Notes類,並使用tableview顯示產品筆記類中的一些數據。當用戶點擊tableview中的任何一行時,我創建ProductNote類對象以訪問其選定的筆記實例方法,然後設置ProductNote Class IBoutlet textmessagenotes.text,但它無。這爲我今天頭痛的問題 – 2012-07-20 12:08:20

+0

This line:[productNote selectedNote:self.selectedNote];在您剛剛分配產品注後立即使用。因此,除非您將產品說明展示/推送到展示架,否則您的所有網點都不能實例化。 @ deanWombourne的答案非常全面。我會完全研究他的答案。 – user523234 2012-07-20 12:41:09

+0

對不起,我不清楚:( – 2012-07-20 12:48:05

相關問題