2017-11-25 5 views
0

프로그래밍 방식으로 많은 UI 요소를 생성하고 있습니다. 50 UILabels라고합시다. 라벨 속성에 액세스하는 적절한 방법은 무엇입니까? 지금은 '보낸 사람'을 통해 [하위 뷰] 배열 얻을 라벨 속성에서 각 레이블 및 다음 검색 라벨에 태그를 추가 해요 : 몇 가지 문제가 우리 경우가 있기 때문에 가장 우아한 방법프로그래밍 방식으로 생성 된 UI 요소 참조하기

func buttonTapped(sender: UIButton) { 

     for subview in containerView.subviews { 

      if let label = subview as? UILabel, label.tag == sender.tag { 
// do stuff 
} 
} 
} 

확실하지 라벨을 버튼으로 변경하십시오.

func createButton() { 
    let button = UIButton(frame: CGRect(origin: ..., 
             size: ...)) 

    button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside) 

    let longTap = UILongPressGestureRecognizer(target: self, action: #selector(disableButton(sender:))) 
    longTap.minimumPressDuration = 1 
    button.addGestureRecognizer(longTap) 

    ....... 
    containerView.addSubview(button) 

} 

을 그리고 송신자가 UILongPressGestureRecognizer 때문에 지금은, disableButton (보낸 사람 : 방법 '보낸 사람'을 통해 속성에 액세스 할 수 없습니다

말할 수 있습니다.

라벨에 대해서는 작동하지만 버튼에 대해서는 작동하지 않는 것처럼 작동합니다. 는 당신이 당신의 라벨

yourLbl.isUserInteractionEnabled = true 

를 만들 때

답변

0

먼저 얻을 수 touchesBegan 방법을 사용하시기 바랍니다 모든 레이블에 대한 참조를 유지하고 배열하므로 모든 하위 뷰를 반복하여 찾아서 가장 높은 z 값을 먼저 유지할 필요가 없습니다. 그러나 여기에서 원하지 않으면 한 줄로 볼 수있는 코드가 있습니다. 그것의 세계에서 가장 효율적인 것은 아니지만 귀하의 숫자에 대한보기 좋을 것입니다.

class ViewController: UIViewController { 
    let first = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 50)) 
    let second = UILabel(frame: CGRect(x: 25, y: 25, width: 100, height: 50)) 
    override func viewDidLoad() { 
     first.text = "first" 
     first.backgroundColor = .blue 
     second.text = "second" 
     second.backgroundColor = .red 
     view.addSubview(first) 
     view.addSubview(second) 
     let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 
     view.addGestureRecognizer(tap) 
    } 
    @objc func handleTap(sender: UITapGestureRecognizer) { 
     if let label = view.subviews.flatMap({$0 as? UILabel}).last(where: { $0.bounds.contains(sender.location(in: $0))}) { 
      print("You pressed: \(label)") 
     } 
    } 
} 

참고 무슨 일이 일어나고 :

  1. 우리는 UIlabels되지 않은 파단을 폐기 flatMap를 사용합니다.
  2. 우리는 마지막으로 배열의 마지막 항목 (가장 많은보기가 UIView.subviews에 따라 마지막이기 때문에 )을 사용합니다. 여기서 터치는 해당보기의 경계 내에 있습니다.
0

단순이 코드를 추가 올바른 방향으로 나를 인도 그리고 당신의 클릭 라벨 모든

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    let touch = touches.first 
    if let lblView = touch?.view 
    { 
     if lblView.isKind(of: UILabel.self) 
     { 
      let yourLbl = lblView as! UILabel 

      //Access your clicked lable 
     } 
    } 


} 
+0

하지만 긴 탭은 어떨까요? 내가 만지면 아무런 문제가 없습니다 – drywet

+0

긴 보도 자료 [long press] (https://stackoverflow.com/questions/45243947/uilabel-long-press-gesture-for-menu-item-of-uimenucontroller)에서이 링크를 확인하십시오. –

관련 문제