ios - 警告 : Method override for designated initializer

标签 ios objective-c

我以编程方式创建了几个表,代码多年来一直运行良好。两周前我上次运行它时它没有生成任何警告。我已经更新到 iOS 8.3,现在每个 UITableViewController 都会收到三个警告。

Method override for the designated initializer of the superclass '-initWithStyle:' not found.

Method override for the designated initializer of the superclass '-initWithCoder:' not found.

Method override for the designated initializer of the superclass '-initWithNibName:bundle:' not found.

初始化表的代码对于我的所有表都是相似的:

- (instancetype)initInManagedObjectContext:(NSManagedObjectContext *)context 
                 withScoreKeeper:(ScoreKeeper *)scorer 
                    withWordList:(WordList *)wordlist {

    self = [super initWithStyle:UITableViewStyleGrouped];

    if (self) {
        _mObjContext = context;
        _scoreKeeper = scorer;
        _wordList = wordlist;
    }
    return self;
}

.h 看起来像这样:

@interface SettingsTableViewController : UITableViewController {
    UIPopoverController *popover;

}
    - (instancetype)initInManagedObjectContext:(NSManagedObjectContext *)context 
                     withScoreKeeper:(ScoreKeeper *)scorer 
                        withWordList:(WordList *)wordlist NS_DESIGNATED_INITIALIZER;

我以为我通过调用 self = [super initWithStyle:UITableViewStyleGrouped]; 覆盖了指定的初始化程序,但我猜编译器现在有其他想法。

那么我该如何覆盖指定的初始化器呢?

最佳答案

禁止父类(super class) NS_DESIGNATED_INITIALIZER

您可以将它们描述为不可用并在有异常(exception)的情况下实现它们。

对于您的示例,在 SettingsTableViewController.h 中:

@interface SettingsTableViewController : UITableViewController
- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;

- (instancetype)initInManagedObjectContext:(NSManagedObjectContext *)context 
                 withScoreKeeper:(ScoreKeeper *)scorer 
                    withWordList:(WordList *)wordlist NS_DESIGNATED_INITIALIZER;

//...your class interface here

@end

SettingsTableViewController.m中:

@interface SettingsTableViewController ()
- (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
@end

@implementation SettingsTableViewController
- (instancetype)initWithStyle:(UITableViewStyle)style { @throw nil; }
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { @throw nil; }
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { @throw nil; }

//...your class implementation here

@end

你也可以在@throw nil;之前加上NSAssert(NO, nil);来知道日志中异常的文件和行号。

允许父类(super class) NS_DESIGNATED_INITIALIZER

您必须明确地实现它们。但是最好的办法是为您的潜在子类删除多余的公共(public) NS_DESIGNATED_INITIALIZER 宏,并且只私下重新引入它。

对于您的示例,在 SettingsTableViewController.h 中:

@interface SettingsTableViewController : UITableViewController
- (instancetype)initWithStyle:(UITableViewStyle)style;
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

- (instancetype)initInManagedObjectContext:(NSManagedObjectContext *)context 
                 withScoreKeeper:(ScoreKeeper *)scorer 
                    withWordList:(WordList *)wordlist NS_DESIGNATED_INITIALIZER;

//...your class interface here

@end

SettingsTableViewController.m中:

@interface SettingsTableViewController ()
- (instancetype)initWithStyle:(UITableViewStyle)style NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
@end

@implementation SettingsTableViewController
- (instancetype)initWithStyle:(UITableViewStyle)style { return [super initWithStyle:style]; }
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { return [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; }
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { return [super initWithCoder:aDecoder]; }

//...your class implementation here

@end

在这两种情况下(允许或禁止),无需更改其余实现。

关于ios - 警告 : Method override for designated initializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29639040/

相关文章:

ios - 以编程方式向上或向下滚动选择器 View

ios - 在表格 View 中创建阴影

iphone - 使用 MagicalRecord 使用当前实体创建新实体

ios - 当我子类化 UIView 并实现空的 drawRect 方法时, colorWithPatternImage 图像会调整大小以填充 View ,为什么?

ios - 旋转事件时无法修复自动布局动画

ios - 适用于 iOS 的 yalantis 标签栏

ios - 向 UIView 添加多个子层只会显示一个

iphone - 将 uitableview 重新加载到底部单元格

iphone - CFAttributedStringRef 中的内存泄漏

ios - UIImage 在主包中加载错误图像