2017-02-27 1 views
1

각 항목에 대해 코드를 한 번 작성하지 않고 컬렉션의 사용 가능한 각 항목에 대한 버튼을 어떻게 추가 할 수 있습니까?컬렉션의 각 항목에 대한 버튼 추가

이것은 내가 지금까지 무엇을 가지고 : 여기

func drawInventory() { 

    if Person.inventory.itemsInBag[0].Id > 0 { 
     let itemButton1 = UIButton() 
     itemButton1.setImage(Person.inventory.itemsInBag[0].Image, for: .normal) 
     itemButton1.frame = CGRect(x: 300, y: 185, width: 30, height: 30) 
     itemButton1.addTarget(self, action: #selector(tapItemInInventory), for: .touchUpInside) 
     view.addSubview(itemButton1) 
    } 
    if Person.inventory.itemsInBag[1].Id > 0 { 
     let itemButton1 = UIButton() 
     itemButton1.setImage(Person.inventory.itemsInBag[1].Image, for: .normal) 
     itemButton1.frame = CGRect(x: 300+40, y: 185, width: 30, height: 30) 
     itemButton1.addTarget(self, action: #selector(tapItemInInventory2), for: .touchUpInside) 
     view.addSubview(itemButton1) 
    } 


} 

func tapItemInInventory() { 
    print(self.Person.inventory.itemsInBag[0].Name + "Pressed") 
} 

func tapItemInInventory2() { 
    print(self.Person.inventory.itemsInBag[1].Name + "Pressed") 

} 

답변

2
func drawInventory() { 
    Person.inventory.itemsInBag.enumerated().filter { $1.Id > 0 }.enumerated().forEach { index, itemAndIndex in 
     let (itemPosition, item) = itemAndIndex 
     let itemButton = UIButton() 

     itemButton.setImage(item.Image, for: .normal) 
     itemButton.frame = CGRect(x: 300 + (40 * itemPosition), y: 185, width: 30, height: 30) 
     itemButton.addTarget(self, action: #selector(tapItemInInventory(_:)), for: .touchUpInside) 
     itemButton.tag = index 
     view.addSubview(itemButton) 
    } 
} 

dynamic func tapItemInInventory(_ button: UIButton) { 
    let item = Person.inventory.itemsInBag[button.tag] 

    print(item.Name + "Pressed") 
} 

, itemButtontag 속성은이에 속하는 항목을 식별하는 데 사용됩니다. 신속하고 더러운 정보 전달 방법이지만이 간단한 예제에서는 잘 작동합니다.

더 나은 해결책은 하위 클래스 UIButton이고 관련 항목을 참조하는 속성을 추가하는 것입니다.

또한 enumerated()이 두 번 호출됩니다. 처음으로 상품의 색인을 itemsInBag 배열로 가져옵니다. ID가 0보다 작 으면 아이템을 버릴 수도 있기 때문에 두 번째로 아이템 위치를 얻습니다.

+0

'map'은 필요한가요? 컬렉션에서 직접 열거 할 수 없습니까? – Losiowaty

+1

전화하세요. 키워드를 삭제하는 것을 잊어 버렸습니다 ... 감사합니다. – tomahh

+0

@ Тимур-Хасанов 나는 나의 대답을 업데이트했다. 나는 선택기를 완벽한 스타일로 썼다. – tomahh

관련 문제