2009-06-19 71 views
0

我遇到以下代碼的問題。正如你可以創建一個TripDetailsController(UIViewController的子類),並使用initWithNibName方法初始化這個TripDetailsController。這個initWithNibName需要一個額外的參數(tripDetails),參見下面的TripDetailsController類的代碼。變量td具有一個值,並且在遍歷代碼時,我檢查了在執行initWithNibName方法時在tdController上設置了此值。但是,在TripDetailsController.viewDidLoad方法(當調用pushViewController()時執行該方法)中設置斷點時,TripDetailsController的tripDetails屬性爲nil?!? 使用調試器我發現我在initWithNibName方法中看到的tdController實例與我在viewDidLoad方法中看到的實例是不同的實例?怎麼來的?爲什麼創建TripDetailsController的新實例以及由誰創建?UIViewController的第二個實例實例化,失去了在原始上完成的初始化。爲什麼?

在這篇文章的最後,我加入了一個調用棧的轉儲,也許這給了你一個提示這個問題的原因。

代碼:

// Code from RootViewController.getTripDetails() (see stacktrace below) 
TripDetails td = ...; // td has a value 
// Push the detail view controller 
TripDetailsController *tdController = [[TripDetailsController alloc] initWithNibName:@"TripDetailsController" bundle:nil tripDetails:td]; 

      // Checked using the debugger that tdController.tripDetails is set 

[self.navigationController pushViewController:tdController animated:YES]; 
[tdController release]; 

代碼:

@implementation TripDetailsController 

@synthesize tripDetails, expectedDurationLabel, normalDurationLabel; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationItem.title = @"Reis Details"; 
    expectedDurationLabel.text = [NSString stringWithFormat:@"%@", tripDetails.expectedDuration]; 
} 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle tripDetails:(TripDetails *)td { 
    self = [self initWithNibName:nibName bundle:nibBundle]; 
    self.tripDetails = td; // self.tripDetails has a value here! 
    [self.tripDetails retain]; 
    return self; 
} 

- (void)dealloc { 
    [self.tripDetails release]; 
    [super dealloc]; 
} 
@end 

alt text http://gerodt.homeip.net/stack.png

任何建議都歡迎。

+1

雖然無關,你不需要做[self.tripDetails保留]因爲,據推測,這個屬性被自動保留。 – 2009-06-19 18:43:47

回答

0

我找到了一種方法,通過遵循Apple的S impleDrillDown example的示例代碼來實現它。

與我的原代碼的主要區別:

  • TripDetailsController不再以文件的.xib
  • TripDetailsController不再加載定義。廈門國際銀行文件,但初始化如下:

代碼:

TripDetailsController *tdController = 
    [[TripDetailsController alloc] initWithStyle:UITableViewStyleGrouped]; 
  • TripDetailsController不再是一個UIViewController,但UITableViewController中

的子類,因此,我不得不調整佈局有點,但至少現在起作用了。

看起來好像無法從XIB文件初始化視圖控制器,然後將其推送到導航控制器。

0

這聽起來像你不保留tripDetails對象,所以你嘗試使用之前,它變得釋放。

+0

我已經在initWithNibName方法中保留了tripDetails對象(參見上面的代碼),並且現在還在創建tripDetails對象的代碼中添加了一個保留。這沒有效果。 我不知道這個問題是否保留了tripDetails對象本身,因爲TripDetailsController實例的指針值在viewDidLoad和initWithNibName方法中是不同的。我期待問題出現在這個領域。爲什麼有兩個TripDetailsController實例?我只創建一個。 – Gero 2009-06-19 18:23:56

+0

您不需要保留,因爲屬性(可能)保留了它。如果它由於某種原因而被釋放,當你嘗試訪問一個釋放對象而不是伊娃成爲零時,你會遇到異常。 – 2009-06-19 18:46:04

0

您應該發佈調用initWithNibName:bundle:的代碼。

我的預感是你正在編程創建一個,但實際上正在使用的那個是在NIB文件中創建的。也許你的主視圖NIB創建一個TripDetailsController作爲選項卡視圖或導航根。在這種情況下,initWithCoder:被調用而不是initWithNibName:bundle:,這將解釋未初始化的td伊娃。

+0

上面包含調用initWithNameName:bundle:tripDetails的代碼。這是第一個代碼片段。其餘的代碼是TripDetailsController的實現。 – Gero 2009-06-19 18:25:44

0

等待,我已經看到了這一點之前:

而不是使一個自定義的初始化程序,使用標準之一,試試這個:

TripDetails td = ...; // td has a value 
TripDetailsController *tdController = [[TripDetailsController alloc] initWithNibName:@"TripDetailsController" bundle:[NSBundle mainBundle]]; 
[tdController setTripDetails:td] 

[self.navigationController pushViewController:tdController animated:YES]; 
[tdController release]; 

原來的答覆: 在TripDetailsController接口,是thipDetails屬性集保留? (而不是分配)。