- This topic has 1개 답변, 2명 참여, and was last updated 4 years, 6 months 전에 by 야곰.
-
글쓴이글
-
-
iJoom참가자
- 글작성 : 8
- 답글작성 : 1
선택적인 뷰 활성화
- 숙박,식사,주류 및 간식 카테고리만 필요하고 나머지 카테고리는 필요없게 선택했다면?
import UIKit class tempViewController: UIViewController { @IBOutlet weak var hotelViewBttn: UIButton! @IBOutlet weak var restaurantViewBttn: UIButton! @IBOutlet weak var drinkViewBttn: UIButton! @IBOutlet weak var transportViewBttn: UIButton! @IBOutlet weak var shoppingViewBttn: UIButton! @IBOutlet weak var activityViewBttn: UIButton! //Button을 이용해 선택한 객체만 뷰를 생성 및 활성화 @IBOutlet weak var completeBttn: UIButton! /*처음 default 선택이 6개이므로*/ var infoOfDate : [String:String] = ["city" : "null", "fromDate" : "null", "toDate" : "null"] // cityname var numOfselected : Int = 6 //선택된 카테고리 갯수 // shared.selectedCategory : [String : Bool] = ["hotel" : true, "restaurant" : true, "drink" : true, "transport" : true, "shopping" : true, "activity" : true] //선택된거 true로 바뀜 // selectedCategory는 뷰의 숫자구성을 하나씩 없애면서 다음 뷰로 전달 var selectedCategoryData : [Int] = [0,1,2,3,4,5] //카테고리 고른거 순서대로 뷰 띄우기 위해서 // custom view shadow 만들기 func makeShadow(outerView : UIView){ outerView.clipsToBounds = false outerView.layer.shadowColor = UIColor.gray.cgColor outerView.layer.shadowOpacity = 0.1 outerView.layer.shadowOffset = CGSize(width: 23, height: 10) outerView.layer.shadowRadius = 3 outerView.layer.shadowPath = UIBezierPath(roundedRect: outerView.bounds, cornerRadius: 10).cgPath } override func viewWillAppear(_ animated: Bool) { self.navigationController?.isNavigationBarHidden = false } override func viewDidLoad() { super.viewDidLoad() // 클릭시 바뀌는 이벤트일 때 처음에 else문부터 들어가서, 두번클릭해야 바뀌는거 방지 // 코드로 인한 버튼 normal로 셋팅 hotelViewBttn.setImage(UIImage(named: "btnMakeStayMinus"), for: .normal) restaurantViewBttn.setImage(UIImage(named: "btnMakeFoodMinus"), for: .normal) drinkViewBttn.setImage(UIImage(named: "btnMakeSnacksMinus"), for: .normal) transportViewBttn.setImage(UIImage(named: "btnMakeTrafficMinus"), for: .normal) shoppingViewBttn.setImage(UIImage(named: "btnMakeShoppingMinus"), for: .normal) activityViewBttn.setImage(UIImage(named: "btnMakeActivityMinus"), for: .normal) }enumerated() – 공식 문서 함수 설명
Returns a sequence of pairs (n, x), where n represents a consecutive integer starting at zero and x represents an element of the sequence.
Return Value
A sequence of pairs enumerating the sequence.
한마디로, Array의 값과 index을 한쌍으로서 찍어내게해줌
for (n, c) in "Swift".enumerated() { print("\(n): '\(c)'") } // Prints "0: 'S'" // Prints "1: 'w'"
/*버튼 이미지가 -일때는 클릭시 +로, +일때는 -로/ 라벨 색 회색 변경*/ @IBAction func pressHotelViewBttn(_ sender: Any) { if hotelViewBttn.image(for: .normal) == UIImage(named: "btnMakeStayMinus"){ hotelViewBttn.setImage(UIImage(named: "btnMakeStayPlus"), for: .normal) numOfselected = numOfselected - 1 TotalPlanData.shared.selectedCategory["hotel"] = false for (i, v) in selectedCategoryData.enumerated(){ if v == 0{ selectedCategoryData.remove(at: i) } } } else{ hotelViewBttn.setImage(UIImage(named: "btnMakeStayMinus"), for: .normal) numOfselected = numOfselected + 1 TotalPlanData.shared.selectedCategory["hotel"] = true selectedCategoryData.append(0) } /*전체 해제시 선택완료 버튼 비활성화*/ if numOfselected == 0{ completeBttn.isEnabled = false } else{ completeBttn.isEnabled = true } selectedCategoryData.sort() print(selectedCategoryData) } @IBAction func pressRestaurantViewBttn(_ sender: Any) { if restaurantViewBttn.image(for: .normal) == UIImage(named: "btnMakeFoodMinus"){ restaurantViewBttn.setImage(UIImage(named: "btnMakeFoodPlus"), for: .normal) numOfselected = numOfselected - 1 TotalPlanData.shared.selectedCategory["restaurant"] = false for (i, v) in selectedCategoryData.enumerated(){ if v == 1{ selectedCategoryData.remove(at: i) } } } else{ restaurantViewBttn.setImage(UIImage(named: "btnMakeFoodMinus"), for: .normal) numOfselected = numOfselected + 1 TotalPlanData.shared.selectedCategory["restaurant"] = true selectedCategoryData.append(1) } /*전체 해제시 선택완료 버튼 비활성화*/ if numOfselected == 0{ completeBttn.isEnabled = false } else{ completeBttn.isEnabled = true } selectedCategoryData.sort() print(selectedCategoryData) } }- 위의 코드로 내가 원하는 카테고리에 맞는 CategoryData 구성
-
EX) 1,3,5 번 카테고리(뷰)만 선택
주의) 일부러 하드코딩된 코드를 보여드립니다. (이렇게 X)
어떻게 하면 간결하게 만들 수 있을까요? 생각해봅시다. (해결방안은 밑에)
-
if let nextCategory = selectedCategoryData.first
-
nextCategory의 값에만 맞는 뷰컨으로 push만 해주면 됨
-
But…..
@IBAction func showNextCategory(_ sender: Any) { let backItem = UIBarButtonItem() backItem.title = "" navigationItem.backBarButtonItem = backItem if let nextCategory = selectedCategoryData.first{ if nextCategory == 0{ let vc = storyboard?.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController var tmpSelectedCategory = selectedCategoryData tmpSelectedCategory.remove(at: 0) vc.selectedCategoryData = tmpSelectedCategory vc.pgValue = numOfselected self.navigationController?.pushViewController(vc, animated: true) } if nextCategory == 1{ let vc = storyboard?.instantiateViewController(withIdentifier: "CategoryFoodViewController") as! CategoryFoodViewController var tmpSelectedCategory = selectedCategoryData tmpSelectedCategory.remove(at: 0) vc.selectedCategoryData = tmpSelectedCategory vc.pgValue = numOfselected self.navigationController?.pushViewController(vc, animated: true) } if nextCategory == 2{ let vc = storyboard?.instantiateViewController(withIdentifier: "CategoryDrinkViewController") as! CategoryDrinkViewController var tmpSelectedCategory = selectedCategoryData tmpSelectedCategory.remove(at: 0) vc.selectedCategoryData = tmpSelectedCategory vc.pgValue = numOfselected self.navigationController?.pushViewController(vc, animated: true) } if nextCategory == 3{ let vc = storyboard?.instantiateViewController(withIdentifier: "CategoryTransportViewController") as! CategoryTransportViewController var tmpSelectedCategory = selectedCategoryData tmpSelectedCategory.remove(at: 0) vc.selectedCategoryData = tmpSelectedCategory vc.pgValue = numOfselected self.navigationController?.pushViewController(vc, animated: true) } if nextCategory == 4{ let vc = storyboard?.instantiateViewController(withIdentifier: "CategoiryShoppingViewController") as! CategoiryShoppingViewController var tmpSelectedCategory = selectedCategoryData tmpSelectedCategory.remove(at: 0) vc.selectedCategoryData = tmpSelectedCategory vc.pgValue = numOfselected self.navigationController?.pushViewController(vc, animated: true) } if nextCategory == 5{ let vc = storyboard?.instantiateViewController(withIdentifier: "ActivityCellViewController") as! ActivityCellViewController var tmpSelectedCategory = selectedCategoryData tmpSelectedCategory.remove(at: 0) vc.selectedCategoryData = tmpSelectedCategory vc.pgValue = numOfselected self.navigationController?.pushViewController(vc, animated: true) }
위의 방법 처럼 X
for문, Sotryboard ID를 String 배열로 만들면 문제해결 가능
-
ex) [“HotelVC”,”ActivityVC”,”333VC”,”4444VC”]
-
nextCategory가 영이라면 배열의 0인덱스 값이 스토리보드 아이디가 되므로
카테고리 뷰를 벗어나서 그 다음 뷰컨에서 내가 선택한 카테고리 순서대로 이동
selectedCategoryData : [Int] = []-
다음 뷰컨에서 카테고리에 맞는 순서를 전달 받고 해당에 맞는 숫자(뷰)를 제거 해주고
-
selectedCategoryData의 첫번째의 숫자에 맞는 카테고리로 뷰컨 이동
-
이 과정을 반복하면, 앞에 카테고리 화면에서 활성화 된 뷰에만 맞는 뷰들로만 뷰컨이 뛰어지게 됨
if selectedCategoryData.count == 0{ //go to next category flow let vc = storyboard?.instantiateViewController(withIdentifier: "totalBudgetViewController") as! totalBudgetViewController self.navigationController?.pushViewController(vc, animated: true) } if selectedCategoryData.count > 0 { //selectedCategoryData의 첫번째 데이터의 뷰로 푸쉬 //푸쉬 하면서 해당 뷰의 숫자 제거 // ex) 1,3,4,5 -> 3,4,5 -> 4,5 }더 좋은 방법이 있다면 제보해주세욥
2020-04-30 오후 3:10 #7412 -
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
좋은 글이네요 🙂
enumerate
메서드를 유용하게 사용하셨네요 ㅎㅎ
infoOfDate
딕셔너리는 사용하지 않는 것 같은데 선언이 되어있는데 이유가 있을까요?
그리고var infoOfDate : [String:String] = ["city" : "null", "fromDate" : "null", "toDate" : "null"]
대신에var infoOfDate : [String:String] = ["city" : nil, "fromDate" : nil, "toDate" : nil]
이렇게 하지 않은 이유도 궁금합니다 🙂2020-05-03 오후 3:58 #7497
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.