我有一个从几个地方调用的视图控制器,第一次调用它时,调用了awakeFromNib,但是没有调用viewDidLoad。每次调用viewWillAppear和viewDidAppear。
此外,视图(UITableView子类)正常运行,但viewDidLoad中的任何内容显然都没有实现。
此视图控制器中未覆盖loadView。
用于覆盖viewDidLoad和awakeFromNib的代码:
- (void)awakeFromNib
{
// Configure for self sizing cells:
self.tableView.estimatedRowHeight = 44;
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.allowsSelectionDuringEditing = YES;
self.clearsSelectionOnViewWillAppear = NO;
self.navigationItem.title = nil;
self.navigationItem.rightBarButtonItem = nil;
printf("\n awake from nib \n \n ---------- \n");
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = self.editButtonItem;
self.tableView.allowsSelectionDuringEditing = YES;
}
如何调用awakeFromNib但是viewDidLoad不是,我该如何解决?
编辑:我收到了一个帮助修复它的答案,但是我想知道它为什么会发生,因为它可能与我的应用中的错误有关。
谢谢。答案 0 :(得分:3)
这在a comment的黑暗中有点刺痛,但结果却解决了这个问题。
确保在重写方法中调用public final class Assertions {
private static final ScriptEngine ENGINE = new ScriptEngineManager().getEngineByName("nashorn");
private Assertions() { }
public static void assertTrue(String expression, Object... values) {
for (int i = 0; i < values.length; i++) {
ENGINE.put("$" + (i+1), values[i]);
}
try {
boolean pass = (Boolean) ENGINE.eval(expression);
if (!pass) {
for (int i = 0; i < values.length; i++) {
expression = expression.replace("$" + (i+1), stringRepresentation(values[i]));
}
throw new AssertionError("An assertion has failed: " + expression);
}
} catch (ScriptException e) {
throw new InternalError(e);
} finally {
for (int i = 0; i < values.length; i++) {
ENGINE.getBindings(ScriptContext.ENGINE_SCOPE).remove("$" + (i+1));
}
}
}
private static String stringRepresentation(Object o) {
if (o instanceof String) {
return "'" + o + "'";
}
return o.toString();
}
}
。