objective-c - 如何编写一个自定义初始化程序来防止 viewDidLoad 被调用?

标签 objective-c uiviewcontroller initialization ios5

我想为 UIViewController 构建一个自定义 init 方法,但是在互联网上特别是在 SO 中深入研究后,我对指定的初始值设定项感到困惑。

我有一个带有这两个初始化器的 UIViewController 子类:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if ( self ) {

  }
  return self;
}

- (id) initWithFilename:(NSString *)aFilename {
  self = [self initWithNibName:@"WallpaperDetailsViewController" bundle:nil];
  if ( self ) { 
    self.filename = aFilename;
  }
  return self;
}

然后我有一个 viewDidLoad 方法,可以根据 filename 属性自定义 View :

- (void)viewDidLoad {
  [super viewDidLoad];

  // Create a UIImageView to display the wallpaper
  self.wallpaper = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.filename]];
  // ...
}

在另一个 UIViewController 中,我进行以下调用:

WallpaperDetailsViewController *detailsViewController = [[WallpaperDetailsViewController alloc] initWithFilename:@"foobar.png"];
[[self navigationController] pushViewController:detailsViewController animated:YES];

结果是 viewDidLoad 由于 [self initWithNibName:] 被调用,它不会初始化 UIImageView 因为 self.filename 为空。

根据其他 SO 问题和答案,这应该是预期的行为。由于我自己在 iOS 5 之前的其他项目中的经验,我对此不确定。我的问题是:

如何确保 viewDidLoad:initWithFilename: 之后调用,而不是在 initWithFilename:initWithNibNameOrNil:bundle:

如果这是不可能的,我如何实现接收自定义数据来创建和自定义 View 的初始化方法?

谢谢!

最佳答案

我发现了问题。

WallpaperDetailsViewController 并不是直接从 UIViewController 继承,而是从我实现的另一个自定义 UIViewController 继承。

问题出在哪里?我已经在父级的 initWithNibName 方法中初始化了一个 subview ,而不是遵循延迟加载技术并在 viewDidLoad 中执行此操作。当 WallpaperDetailsViewController 调用其父初始化器时,它变得困惑并导致 viewDidLoad 无法正常运行。

解决方案?我将父类中的每个 subview 初始化移至其 viewDidLoad 方法,并保持 WallpaperDetailsViewController 的原始实现不变。现在一切都按预期进行

感谢@Josh Caswell 和@logancautrell

关于objective-c - 如何编写一个自定义初始化程序来防止 viewDidLoad 被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862421/

相关文章:

ios - 这些关于 IOS 委托(delegate)的观点是否正确?是还是不是?

ios - 如何使 UIViewController 半透明

java - 非初始化和初始化为空有什么区别?

objective-c - iOS 异常 EXC_GUARD

ios - 将包含 Latex Command for Mathematical 公式的 HTML 文本转换为输出正确公式的纯文本或属性文本

ios - 使用 NSNotificationCenter 在 VC 之间发送数据

ios - UICollectionview 实现搜索

c - 在 C 中使用宏将项目附加到数组

c++ - 通过函数调用进行大括号或等号初始化

Objective-C:为什么自定义对象会变成僵尸