2

我想要一个 custom 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;
}

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

4

4 回答 4

2

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

于 2012-06-19T20:16:41.483 回答
2

是的,这是有道理的。此外,如果你想保持你的 init 干净,你可以执行以下操作:

- (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 。

希望有帮助。

编辑

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

//.m
@interface YourController ()

@property (nonatomic, copy) NSString* myFeedType;

@end

@implementation YourController

@synthesize myFeedType;

@end
于 2012-06-19T20:21:17.483 回答
1

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

于 2012-06-19T20:16:12.060 回答
0

等待!它可能不是最好的原因有一个:从情节提要加载视图控制器时不会调用此方法。出于这个原因,我建议使用viewDidLoad:自定义逻辑,并将自定义字符串设置为属性。

于 2012-06-19T20:19:59.747 回答