【问题标题】:Identifying views on UIViewController识别 UIViewController 上的视图
【发布时间】:2017-03-06 16:08:02
【问题描述】:

我正在构建一个具有带有图像的滚动视图的应用程序。最重要的是,我正在添加基于我的自定义类的视图。想象一个带有大头针的滚动 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?

【问题讨论】:

  • 为什么不创建一个“Pins”(一个数组)的集合?然后,您可以在任何时候添加或删除此集合中的添加或删除。然后,您不必通过“子视图”集合获取它们并确定它们是引脚还是其他操作系统给定的视图。
  • 你是对的,这就是我要做的。该代码并没有真正表明我知道,但可以想象 dynamicUserPin 将被一组引脚替换并作为子视图添加到视图中。我想问题是如何再次访问视图对象以获取用户 ID?
  • 如果你有一个数据数组可以变成这些“Pins”,那么为什么不也有一个“Pins”数组呢?然后,您可以遍历“Pins”并直接从它们获取 UserID。我想我还没有完全理解这个困境。
  • @Putz1103 为您提供解决方案,因为您在每个引脚上都有用户 ID 等,您只需对照数组检查 UIView 用户 ID 并从 superView 中删除 UIView 并从数组中删除等效数据。
  • 不要使用“层”这个词。称它们为子视图。在 iOS 中,视图由核心动画层(CALayer 对象)支持,因此使用术语层会引起混淆。

标签: ios swift uiview uiviewcontroller


【解决方案1】:

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

var mapPins: Set

每当您创建一个新引脚时,将其插入到该可变集合中,并将其添加为 subView

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

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

如何通过点击找到图钉?

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

为点击识别器创建一个方法来调用您的UIViewController 子类:

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

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

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

【讨论】:

  • 好的,我想我已经开始了。所以假设我有一个名为 mapPins 或 userPins 的可变数组......我如何通过点击它来获取 pin?
  • @user2091936 最简洁的方法是在 UIView 中创建一个委托并在其中添加一个 UITapGestureRecognizer。当您点击 UIView 时,您只需使用您的委托方法回调 UIViewController。当您添加每个 pin 子视图时,您当然必须将 UIViewController 设置为委托响应者。 pinView.delegate = self
猜你喜欢
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多