识别UIViewController上的视图

时间:2017-03-06 16:08:03

标签: ios swift uiview uiviewcontroller

我正在构建一个带有图像的滚动视图的应用程序。最重要的是,我根据自定义类添加视图。想象一下带有引脚的滚动UI视图图片。背景图片然后每个引脚都是一个新层。

这样的事情(不是完整的代码,但非常全面,会让你很好地了解我想要做的事情。)

class MapViewController: UIViewController, UIScrollViewDelegate, UITextFieldDelegate, CLLocationManagerDelegate {

    var scrollView : UIScrollView!
    var imageView : UIImageView!



       override func viewDidLoad() {

            create()
            super.viewDidLoad()

        }

    func create() {
          let dynamicUserPin = UserPin(userID: "UX2318afjk2-fa8hasd-hasdf-jada-fjasd", name: "Ric", posX: Int(1500), posY: Int(1800), pictureURL: "11056102_10100155919186355_3729750518855248330_n.jpg", direction: 1, colour: "Red", currentTrack: 33, lastTimeConnected: Date())
              dynamicUserPin.tag = 1000

         containerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.viewTapped(_:))))


            imageView.addSubview(dynamicUserPin)

            containerView.addSubview(imageView)


            scrollView.addSubview(containerView)

            view.addSubview(scrollView)
    }
}

我的问题是我必须找到非常动态的视图(UserPins)并随着时间的推移而改变。我可以通过迭代视图来找到用户引脚。那没问题。问题是如何在没有标签的情况下做到这一点,因为这意味着保持我的用户ID和标签之间的映射,我试图避免。我如何获得子视图的详细信息?我创建了一个扩展来获取子视图:

extension UIView {
     func subviewsList() -> [UIView] {
          var subviews = self.subviews
          if subviews.count == 0 {
               return subviews + []
          }
          for v in subviews {
               subviews += v.subviewsList()

          }
          return subviews
     }
}

我的视图类看起来像这样:

导入UIKit

class UserPin: UIView {


    var userID : String?
    var name : String?
    var posX : Int?
    var posY : Int?
    var pictureURL : String?
    var direction : Int?
    var colour : String?
    var currentTrack : Int?
    var lastTimeConnected : Date?


    init(userID: String, name: String, posX: Int, posY: Int, pictureURL: String, direction: Int, colour: String, currentTrack : Int, lastTimeConnected : Date)
    {
        self.userID = userID
        self.name = name
        self.posX = posX
        self.posY = posY
        self.pictureURL = pictureURL
        self.direction = direction
        self.colour = colour
        self.currentTrack = currentTrack
        self.lastTimeConnected = lastTimeConnected

        super.init(frame: CGRect(x: posX, y: posY, width: 100, height: 100))
        print("finished init")
        self.addControls(userID, name: name, posX: posX, posY: posY,  pictureURL: pictureURL, direction: direction,  colour: colour,  currentTrack: currentTrack, lastTimeConnected: lastTimeConnected)
    }

那么如何获取我添加的视图的用户ID?

1 个答案:

答案 0 :(得分:1)

您的UIViewController子类应包含一个名为mapPins的可变集,声明如下:

var mapPins: Set

无论何时创建新引脚,都要将其插入到该可变集中,并将其添加为subView

然后,如果您需要访问所有引脚,只需遍历mapPins集的内容。

  

我想问题是如何再次访问view对象以获取用户ID?

     

如何通过点击它来获取引脚?

有几种方法可以做到这一点。我建议为每个引脚视图设置一个UITapGestureRecognizer。 (在创建图钉的同时制作手势识别器。)

为点击识别器创建一种方法,以便调用UIViewController子类:

func handleTapOnPin(_ recogniser: UITapGestureRecognizer?) {
    // a pin has been tapped on
}

将手势识别器的目标设置为子类,并将操作设置为此方法的选择器,如下所示:#selector(self.handleTapOnPin(_:))

在该方法中,要访问您的图钉,您可以执行recognizer.view()