Получите текущего первого респондента, не используя частный API

Используйте обновление с коррелированным подзапросом:

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;
333
задан Mark Amery 12 January 2014 в 11:26
поделиться

6 ответов

В одном из моих приложений я часто хочу, чтобы первый респондент ушел в отставку, если пользователь нажимает на фон. Для этой цели я написал категорию в 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`
}
329
ответ дан 23 November 2019 в 00:43
поделиться

Самый простой способ найти первого респондента:

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 в Ваших собственных целях.

0
ответ дан 23 November 2019 в 00:43
поделиться

Перебрать представления, которые могут быть первыми респондентами, и использовать - (BOOL) isFirstResponder , чтобы определить, есть ли они в настоящее время.

5
ответ дан 23 November 2019 в 00:43
поделиться

Вот что я сделал, чтобы найти, какое 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];
                }

            }
        }

    }

}
3
ответ дан 23 November 2019 в 00:43
поделиться

Если ваша конечная цель - просто откажитесь от первого респондента, это должно сработать: [self.view endEditing: YES]

529
ответ дан 23 November 2019 в 00:43
поделиться

Это некрасиво, но то, как я отказываюсь от firstResponder, когда я не знаю, что это за респондент:

Создайте UITextField, либо в IB, либо программно. Сделайте это скрытым. Свяжите его со своим кодом, если вы сделали это в IB.

Затем, когда вы хотите закрыть клавиатуру, вы переключаете респондента на невидимое текстовое поле и немедленно отказываетесь от него:

    [self.invisibleField becomeFirstResponder];
    [self.invisibleField resignFirstResponder];
30
ответ дан 23 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: