Обновление: я был неправ. Вы действительно можете использовать UIApplication.shared.sendAction(_:to:from:for:)
для вызова первого ответчика, продемонстрированного в этой ссылке: http://stackoverflow.com/a/14135456/746890 .
Большая часть ответы здесь не могут действительно найти текущего первого ответчика, если он не находится в иерархии представлений. Например, AppDelegate
или UIViewController
подклассы.
Существует способ гарантировать, что вы найдете его, даже если первый объект-ответчик не является UIView
.
Сначала позволяет реализовать обратную версию, используя свойство next
в UIResponder
:
extension UIResponder {
var nextFirstResponder: UIResponder? {
return isFirstResponder ? self : next?.nextFirstResponder
}
}
С помощью этого вычисленного свойства мы можем найти текущего первого ответчика снизу вверх, даже если это не UIView
. Например, от view
до UIViewController
, который управляет им, если контроллер представления является первым ответчиком.
Однако нам по-прежнему необходимо разрешение сверху вниз, одно var
- получить текущий ответчик.
Сначала с иерархией представления:
extension UIView {
var previousFirstResponder: UIResponder? {
return nextFirstResponder ?? subviews.compactMap { $0.previousFirstResponder }.first
}
}
Это будет искать первого ответчика назад, и если он не сможет его найти, он скажет его подпункты делать то же самое (потому что его subview next
не обязательно сам). С этим мы можем найти его из любого вида, включая UIWindow
.
И, наконец, мы можем построить это:
extension UIResponder {
static var first: UIResponder? {
return UIApplication.shared.windows.compactMap({ $0.previousFirstResponder }).first
}
}
Итак, когда вы хотите получить первого ответчика, вы можете позвонить:
let firstResponder = UIResponder.first
Вы можете выполнить XPath относительно каждого элемента asset
, чтобы получить vin
и gps
напрямую, без зацикливания:
for asset_xml in root.findall("./assetlist/asset"):
print(asset_xml.attrib['id'])
vin = asset_xml.find("vin")
print(str(vin.text))
gps = asset_xml.find("gps")
print(str(gps.text))