自定义initWithNibName

时间:2012-06-19 20:11:50

标签: iphone objective-c ios ipad initialization

我希望有一个自定义initWithNibName,基本上传入另一个NSString作为类型,根据类型确定此UIViewController内的一些逻辑。所以我设置如下:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil andFeedType:(NSString *)feedType
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

这甚至有意义吗?因为我没有经常看到这种类型的init。如果没有,那么最好的方法是什么?

4 个答案:

答案 0 :(得分:2)

这对我来说非常有意义。这是覆盖初始化程序以在Objective-C中添加一些自定义初始化的方法。你认为它有什么问题?

答案 1 :(得分:2)

是的,这是有道理的。此外,如果您想保持初始化,可以执行以下操作:

- (id)initWithFeedType:(NSString *)feedType
{
    self = [super initWithNibName:@"YourNibName" bundle:nil]; // nil is ok if the nib is included in the main bundle
    if (self) {

        // Set your feed here (copy it since you are using a string)

        // see the edit
        myFeedType = [feedType copy];
    }
    return self;
}

有关详细信息,请参阅 Ole Begemann撰写的帖子initWithNibName-bundle-breaks-encapsulation

希望有所帮助。

修改

如果外部对象无法访问该Feed属性,请为您的控制器创建类扩展,如下所示:

//.m
@interface YourController ()

@property (nonatomic, copy) NSString* myFeedType;

@end

@implementation YourController

@synthesize myFeedType;

@end

答案 2 :(得分:1)

确实有意义。您正在创建自己的初始化程序,根据您的需求量身定制。此外,您正在做您应该做的事情,即在您的自定义init方法中调用指定的初始值设定项(在UIViewController initWithNibName:bundle:的情况下)。

答案 3 :(得分:0)

等待! 有一个原因可能不是最佳:当从故事板加载视图控制器时,此方法被调用。出于这个原因,我建议使用viewDidLoad:代替自定义逻辑,并将自定义字符串设置为属性。