如何在不使用tag方法的情况下访问UIView

时间:2017-03-07 23:48:45

标签: ios swift uiview uiviewcontroller

我有自己的自定义视图,并将它们动态添加到UIViewController。

这些观点类似于:

class pinView: UIView {


    var userID : String?
    var lastTimeConnected : Date?


    init(userID: String, lastTimeConnected : Date)
    {
        self.userID = userID
self.lastTimeConnected = lastTimeConnected

    }

然后我通过调用

将我的视图添加到UIViewController
 imageView.addSubview(pinViewInstance) in a loop

我有一些事件会触发我的观点在屏幕上移动。我调用数据库来获取新的位置,然后我需要更新它们。如何在自定义视图上使用userID进入视图?我会使用标签,但它们只是INT,我需要比这更大的东西。否则,我需要将标签映射到我真正想要避免的用户标识。

要清楚......我知道我可以这样做: 让pinViewInstance = self.view.viewWithTag(numberHere)为? pinView 但我想要的是通过ID访问它,这是我首先扩展UIView类的第一个原因。

我希望你知道如何解决这个问题一直困在它上面并且看不到它的方法。非常感谢您的帮助。 谢谢!

2 个答案:

答案 0 :(得分:4)

两个选项:

One:使用for循环遍历UIImageView.subviews,并添加了这些自定义视图。将每个视图设置为pinView引用并比较其中的userID。

func getPinView(userId: String) -> (pinView?) {
    for view in self.imageView.subviews as [UIView] {
        if let pin = view as? pinView {
            if pin.userID == userId {
                return pin
           }
        }
    }
    return nil
}

二:当您添加pinView时,将其添加到以userId为键的字典中。当你需要pinView时。用钥匙拿到它:

// init
var pinViews: [String: pinView] = [:]

// after adding subview
pinViews[pinViewInstance.userID] = pinViewInstance

// get pinView
let pin: pinView = pinViews[userID] as! pinView

答案 1 :(得分:1)

您可以使用此类类型检查来遍历pinView并找到if type(of: aSubview) == pinView.self

userID

然后,您可以访问userID并检查右侧constructor.name