Рекурсивно найти представление определенного типа iOS - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть UIView Я хочу проанализировать все подпредставления представления и вернуть экземпляр подпредставления типа CustomClass

При view.subviews я получаю только непосредственные подпредставления, яхочу проанализировать все подпредставления и вернуть мое подпредставление, соответствующее условию.

findView(key : uniqueKey , view : UIView)

for subview in view.subviews {
if subview.uniqueKey == key 
return subview       // and break 
else 
continue with recursively searching
}

Я знаю, что мне нужно решить это рекурсивно, но я уверен, что присутствует только один экземпляр этого представления, так что, как только я найдуэкземпляр, который я хотел бы вернуть и прервать рекурсию.

Как мне добиться того же.

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Вы можете использовать этот универсальный метод расширения UIView, чтобы найти любой объект определенного класса.Возвращает ноль, если для этого класса не существует подпредставления.

extension UIView {
    func find<T:UIView>(_ ofType:T.Type) -> T? {
        if let test = subviews.first(where: { $0 is T }) as? T {
            return test
        } else {
            for view in subviews {
                return view.find(ofType)
            }
        }
        return nil
    }
}

Использование

let firstBtn = self.view.find(UIButton.self)
0 голосов
/ 20 февраля 2019

Вот функция с тегом просмотра, вы можете заменить ее своим уникальным ключом.

func findView(tag :Int, view : UIView) -> UIView? {
    if view.tag == tag {
        return view
    }

    for subview in view.subviews {
        if let v = findView(tag: tag, view: subview) {
            return v
        }
    }

    return nil
}
0 голосов
/ 20 февраля 2019

вы хотите пополнить свой пользовательский вид с помощью uniqueKey, затем используйте следующую функцию, чтобы получить результат в соответствии с вашими требованиями.

func findView(key : uniqueKey , view : UIView) -> customView? {
        var fondSubview:customView!

        for subview in view.subviews {
            if subview.uniqueKey == key {
               fondSubview = subview as! customView
                break
            }
        }        
        return fondSubview
    }
0 голосов
/ 20 февраля 2019
func findView(key: String, view: UIView) -> UIView? {
    for subview in view.subviews {
        if subview.key == key {
            return subview
        } else {
            return findView(key: key, view: subview)
        }
    }

    return nil
}

Примечание: ключ не определен в UIView, поэтому логика поиска предполагает, что вы определили это с помощью протокола или расширения

...