The answer:
No, there does not have to be a first responder at all times. You can find routines on git to walk every subview from self.view, looking for the first responder, if you care to:
@implementation UIView (FindFirstResponder)
- (UIView *)findFirstResponder
{
if (self.isFirstResponder) {
return self;
}
for (UIView *subView in self.subviews) {
UIView *firstResponder = [subView findFirstResponder];
if (firstResponder != nil) {
return firstResponder;
}
}
return nil;
}
@end
I tried this, and sometimes it returned with nil as expected. self.view still got the message sent to first responder.