0

我已使用自定义 init 方法将 NSMutableDictionary 传递到 FirstClass 中。

二等,

firstClass = [[FirstClass alloc] initWithFeedData:feedDictionary];

[self.navigationController pushViewController:firstClasss animated:YES];

头等舱,

 - (FirstClass *) initWithFeedData:(NSMutableDictionary *) dataDictionary {
 {
     NSLog(@"%@", dataDictionary);

     [[NSBundle mainBundle] loadNibNamed:@"FirstClass" owner:self options:nil];

    //[self viewDidLoad]; Without call, ViewDidLoad method doesn't call.

 }

 - (void) viewDidLoad {

      [super viewDidLoad];

      NSLOG(@"Inside View DidLoad"); // This method never calls.
  }

在我的 viewDidLoad 方法没有被调用,如果我调用“[self viewDidLoad]”那么只有 viewDidLoad 方法可以正常工作。我不知道为什么 viewDidLoad 方法不直接调用而不调用另一个方法?请帮帮我。

谢谢。

4

3 回答 3

2

如果你正在继承 a UIViewController,我假设你是因为你期待viewDidLoad,那么你应该覆盖它指定的初始化程序,initWithNibName:bundle:如果你使用的是 XIB,在这种情况下viewDidLoad将在 XIB 加载后调用。如果您不使用 XIB,则应实现loadView创建视图的方法,并在完成viewDidLoad后调用loadView

于 2011-02-01T11:57:00.867 回答
1

@Stephen 是对的,至少你需要重写你的 init 语句来 return self。但是,在视图控制器上声明一个属性并以这种方式传递对象要容易得多,也更健壮。

FirstClass *firstClass = [[FirstClass alloc] initWithNibNamed:nil];
firstClass.feedDictionary = feedDictionary;

[self.navigationController pushViewController:firstClasss animated:YES];
[firstClass release];

viewDidLoad现在将调用您的方法,您feedDictionary将坐在那里等着您。

于 2011-02-01T12:02:18.397 回答
0

你的init方法不对。它应该看起来像这样:

- (id) initWithFeedData:(NSMutableDictionary *) dataDictionary {
  if (self = [super init]) {
    // TODO: do initialisation stuff with dataDictionary
  }

  return self;
}

这假设FirstClass源自UIViewController

只要您的 NIB 文件与您的类同名,它就应该自动加载——不需要loadBundle:调用。以下是文档中有关该nibName属性的内容:

如果此属性的值为 nil 并且您没有覆盖自定义子类中的 loadView 方法,则视图控制器会查找名称(不带 .nib 扩展名)与视图控制器类的名称匹配的 nib 文件。

于 2011-02-01T11:48:59.247 回答