Используйте обновление с коррелированным подзапросом:
UPDATE Cars a
SET a.type = 'winter'
WHERE
(SELECT b.month FROM Season b WHERE a.productID = b.productID) < 3 OR
(SELECT b.month FROM Season b WHERE a.productID = b.productID) > 11;
В одном из моих приложений я часто хочу, чтобы первый респондент ушел в отставку, если пользователь нажимает на фон. Для этой цели я написал категорию в UIView, которую я вызываю в UIWindow.
Следующее основано на этом и должно возвращать первого респондента.
@implementation UIView (FindFirstResponder)
- (id)findFirstResponder
{
if (self.isFirstResponder) {
return self;
}
for (UIView *subView in self.subviews) {
id responder = [subView findFirstResponder];
if (responder) return responder;
}
return nil;
}
@end
iOS 7+
- (id)findFirstResponder
{
if (self.isFirstResponder) {
return self;
}
for (UIView *subView in self.view.subviews) {
if ([subView isFirstResponder]) {
return subView;
}
}
return nil;
}
Swift:
extension UIView {
var firstResponder: UIView? {
guard !isFirstResponder else { return self }
for subview in subviews {
if let firstResponder = subview.firstResponder {
return firstResponder
}
}
return nil
}
}
Пример использования в Swift:
if let firstResponder = view.window?.firstResponder {
// do something with `firstResponder`
}
Самый простой способ найти первого респондента:
func sendAction(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) -> Bool
реализация по умолчанию диспетчеризирует метод действия для данного целевого объекта или, если никакая цель не указана первому респонденту.
Следующий шаг:
extension UIResponder
{
private weak static var first: UIResponder? = nil
@objc
private func firstResponderWhereYouAre(sender: AnyObject)
{
UIResponder.first = self
}
static var actualFirst: UIResponder?
{
UIApplication.shared.sendAction(#selector(findFirstResponder(sender:)), to: nil, from: nil, for: nil)
return UIResponder.first
}
}
Использование: Просто доберитесь UIResponder.actualFirst
в Ваших собственных целях.
Перебрать представления, которые могут быть первыми респондентами, и использовать - (BOOL) isFirstResponder
, чтобы определить, есть ли они в настоящее время.
Вот что я сделал, чтобы найти, какое UITextField является первым респондером, когда пользователь нажимает Save/Cancel в ModalViewController:
NSArray *subviews = [self.tableView subviews];
for (id cell in subviews )
{
if ([cell isKindOfClass:[UITableViewCell class]])
{
UITableViewCell *aCell = cell;
NSArray *cellContentViews = [[aCell contentView] subviews];
for (id textField in cellContentViews)
{
if ([textField isKindOfClass:[UITextField class]])
{
UITextField *theTextField = textField;
if ([theTextField isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}
}
Если ваша конечная цель - просто откажитесь от первого респондента, это должно сработать: [self.view endEditing: YES]
Это некрасиво, но то, как я отказываюсь от firstResponder, когда я не знаю, что это за респондент:
Создайте UITextField, либо в IB, либо программно. Сделайте это скрытым. Свяжите его со своим кодом, если вы сделали это в IB.
Затем, когда вы хотите закрыть клавиатуру, вы переключаете респондента на невидимое текстовое поле и немедленно отказываетесь от него:
[self.invisibleField becomeFirstResponder];
[self.invisibleField resignFirstResponder];