在viewdidload方法之前初始化变量

时间:2010-10-23 12:16:44

标签: iphone

我点击表格中的一行并转到新视图,在viewdidload中我将nav.title放入网址并发送到php页面。然而,url是在nav.title初始化之前发送的,所以我从php接收null。我如何确保在viewdidload之前初始化nav.title,或者有人能想出更好的方法来构造这段代码吗?感谢

2 个答案:

答案 0 :(得分:1)

viewDidLoad方法位于UIViewController。我觉得使用视图控制器很棘手的是有时你会在代码中实例化它们,有时你会从NIB文件中实例化它们。

这两个实例化路径不共享正确初始化的常用方法。所以我已经付诸实践,总是使用这样的模式实现我的所有UIViewController子类:

- (void)primitiveInit {
    // Here I setup all my instance variables.
}

// Designated initializer for instantiating in code.
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
    self = [super initWithNibName:nibName bundle:nibBundle];
    if (self) {
        [self primitiveInit];
    }
    return self;
}

// Always called when instantiated from NIB.
- (void)awakeFromNib {
    [super awakeFromNib];
    [self primitiveInit];
}

通过这种方式,我可以始终信任primitiveInit在我的视图控制器上调用它们,然后才能在屏幕上显示,并接收任何外部事件。

我所做的实际上是我在NSObject上添加了一个类别,该类别从根类primitiveInit方法和根类init调用awakeFromNib方法。这样我只需要在任何类中实现primitiveInit,而不关心它们是如何实例化的。但这稍微提高了一些,解释它的工作原理是一个独立的话题。

@implementation NSObject (CWPrimitiveInit)

+ (void)load {
    Method m1 = class_getInstanceMethod(self, @selector(init));
    Method m2 = class_getInstanceMethod(self, @selector(cw_init));
    method_exchangeImplementations(m1, m2);
    m1 = class_getInstanceMethod(self, @selector(awakeFromNib));
    m2 = class_getInstanceMethod(self, @selector(cw_awakeFromNib));
    method_exchangeImplementations(m1, m2);
}

- (void)primitiveInit {
}

- (id)cw_init {
    self = [self cw_init];
    [self primitiveInit];
    return self;
}

- (void)cw_awakeFromNib {
    [self cw_awakeFromNib];
    [self primitiveInit];
}

@end

答案 1 :(得分:0)

我没有在应用程序中获取php的经验。但我会尝试不使用nav.title的当前内容设置URL的内容。您可以尝试在新视图打开之前执行此操作。

  1. 当用户在tableviewcontroller中选中一个单元格时,初始化视图控制器
  2. 使用正确的set-methode
  3. 设置视图控制器的URL变量
  4. 设置后加载新视图 - 它现在应该具有独立于导航栏标题的网页的正确链接
  5. 我希望这会有所帮助......再见