@wonbingg
웡빙! 드디어 Step3 PR입니다! 웡빙의 날카로운 리뷰를 볼 때마다 무릎을 탁 친답니다ㅎ
이번 리뷰도 잘부탁드리겠습니다!😎
## 고민했던 점
### 1. ```stepper```의 초기화 위치
stepper의 값을 현재 과일 재고 수량으로 초기화하기 위해 ```@IBAction func pushStepper(_ sender: UIStepper)```에서 ```stepper.value```값을 변경해주었습니다. 하지만```@IBAction func pushStepper(_ sender: UIStepper)```로 초기화할 경우 ```stepper```를 누를 때마다 초기화되는 문제점이 발견되었습니다. 이를 해결하기 위해 ViewController가 초기화될 때, 즉 viewDidLoad에 ```stepper.value```를 함께 초기화해주었습니다.
```swift
override func viewDidLoad() {
super.viewDidLoad()
displayStock()
initializeSteppers()
setUpNavigationItem()
}
```
### 2. IBOutlet Collection
Stepper의 초기화를 한 번에 구현하기 위해 ```initializeSteppers()```메서드에서 모든 Stepper에 접근할 수 있도록 IBOutlet Collection에 담아주었습니다.
```swift
@IBOutlet var steppers: [UIStepper]!
func initializeSteppers() {
for stepper in steppers {
if let selectedFruit = identifyRelatedFruit(of: stepper),
let initialValue = fruitsStock[selectedFruit] {
stepper.transform = stepper.transform.scaledBy(x: 1.0, y: 1.0)
stepper.value = Double(initialValue)
}
}
}
```
### 3. Navigation Bar
요구사항 화면에는 NavigationBar의 크기가 저희가 사용하는 NavigationBar보다 컸습니다. 처음에는 요구사항에 맞춰서 NavigationBar대신 View를 이용해서 만들었습니다. 하지만 근본적인 원인을 해결한거 같지 않아서 NavigationBar를 사용하여 height 값을 높여주려 했습니다. height값을 올려주기 위해 조사해본 결과 iOS11 이상부터는 높이 커스터마이징을 할 수 없다라는 결론이 나와 height값을 올려주지 못했습니다.
### 4. Notification
```ChangeStockViewController```에서 ```MainViewController```으로 화면전환 시 변경된 사항을 전달하기 위해 ViewWillAppear를 사용하려 했습니다. 하지만 Modal의 경우 Full-Screen Modal이 아닐 경우 이전 화면으로 돌아갈 때, 이전 화면이 새로 표현되는 것이 아니기 때문에 ViewWillAppear, ViewDidAppear 등의 메서드를 오버라이딩할 수 없었습니다. 이를 해결하기 위해 Notification을 활용하여 ```ChangeStockViewController```의 변경사항이 있을 시 과일의 재고를 갱신했습니다. <br/> <br/> 변경사항의 ```post``` 시점은 재고 변경사항을 한 번에 전달할 수 있도록 ```viewWillDisappear```메서드를 override하여 정해주었습니다.
### 5. name space (alert message)
Alert에서 각각의 ```String```을 직접 넣는 방식보다 열거형을 통해 NameSpace를 선언하여, 가져오는 방식을 채택했습니다.
```swift
private enum AlertMessege {
static let confirm = "확인"
static let yes = "예"
static let no = "아니오"
static let madeJuice = "가 나왔습니다. 맛있게 드세요!"
static let lackOfStock = "재료가 모자라요. 재고를 수정할까요?"
static let success = "성공"
static let failure = "실패"
}
```
### 6. 재고변경 뷰컨에서 레이블을 각각 초기화 or 모두 초기화
```displayStock()```메서드를 통해 모든 Label을 초기화 할 수 있지만 하나의 Stepper의 IBAction으로 재고의 변경이 있을 때, 전체를 초기화하기 보다는 해당하는 과일의 재고만 업데이트 할 수 있도록 ```pushStepper(_:)```메서드에서 해당 Label을 업데이트 해주었습니다.
```swift
@IBAction func pushStepper(_ sender: UIStepper) {
guard let fruitsLabel = identifyRelatedLabel(of: sender),
let fruit = identifyRelatedFruit(of: sender) else { return }
FruitStore.shared.fruitsStock[fruit] = Int(sender.value)
fruitsLabel.text = Int(sender.value).description
}
```