UITableViewController在UIViewController问题内部加载UIViewController

时间:2011-03-28 15:12:03

标签: iphone xml uiviewcontroller uitableview

我真的不知道我在做什么是正确的做法。现在它似乎正在工作,直到它用EXC_BAD_ACCESS消息到达某一点。

我将描述我正在做的最好的事情以及我能说的最相关的细节: 我有一个CalendarViewController,它继承了从.xib文件(CalendarViewController.xib)加载的UIViewController。该类包含一个名为contentView的UIView,它是我创建的,我使用另一个基于同样继承自UIViewController的类的nib文件进行初始化:

- (void)viewDidLoad {

      [super viewDidLoad];

      calendarView = [[CalendarView alloc] initWithNibName:@"CalendarView" bundle:nil];

      [contentView addSubview:calendarView.view]; 

   }

(calendarView是继承UIViewController的类,viewDidLoad来自CalendarViewController。

CalendarView.xib有一个UITableViewController,它有各自的UITableView。这个表视图控制器链接到CalendarTableController,我也为它生成了一个.xib文件。

所有东西都是正确的(显然)创造出来但却在某个意外的地方崩溃。 CalendarTableController还实现了一个DateLoaderDelegate,它从外部URL上的xml加载信息。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

   // When the data has all finished loading, we set a copy of the  
  // loaded data for us to access. This will allow us to not worry about
 //  whether a load is already in progress when accessing the data. 

    self.lastLoadedMatchXMLData = [self.matchXMLData copy]; 

 // Make sure the _delegate object actually has the xmlDidFinishLoading     
 // method, and if it does, call it to notify the delegate that the     
 // data has finished loading.  

 if ([_delegate respondsToSelector:@selector(xmlDidFinishLoading)])
 {      
     [_delegate xmlDidFinishLoading];
 } 

}

应用程序正在顺利到达这一点。 _delegate包含正确的对象(实现DateLoaderDelegate的CalendarTableController)。但当它到达生产线时:

  if ([_delegate respondsToSelector:@selector(xmlDidFinishLoading)])

它与EXC_BAD_ACCESS崩溃,我真的不知道原因,如果我看一下调试器,我的任何类中都没有发生崩溃,因为它们中的任何一个都出现在执行堆栈中。 URLConnectionClient似乎正在生成它,但我真的不知道为什么。在重新安排ViewControllers工作之前,xml的加载已经开始工作了,正如我现在所描述的那样。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这很奇怪。我修复了问题,但我不得不将整个UIViewController用于包含UITableView。我做的是这个:

  1. 使用自定义UIViewController中的自定义UITableViewController(CalendarTableViewController)创建一个IBOutlet。
  2. 在加载的.xib文件中,我将IBOutlet链接到声明为CalendarTableViewController的已创建的UITableViewController。
  3. 这样我解决了UITableViewController被无故释放的问题。但是现在我放在中间UIViewController中的图像视图不会出现。我必须将UIViewController设置为仅包含CalendarTableView并将图像视图放在初始的UIViewController中。很奇怪,不是吗?我不太喜欢我创建的层次结构......但是现在这样做会是S

答案 1 :(得分:0)

检查您是否已为所有子视图定义了属性,并确保保留所需的所有内容。访问不良可能意味着您试图在已发布的对象上调用respondsToSelector

答案 2 :(得分:0)

在将嵌套控制器的视图添加到父视图之前,您是否尝试过调用 loadView

在添加视图之前,可能 viewDidLoad 未执行,并且某些变量从未初始化。