2017-09-14 15 views
0

내 이미지보기에 자리 표시 자 이미지를 설정했습니다. 사용자는 사진을 라이브러리에서 변경할 수 있습니다. 일단이 작업을 완료하면이 이미지를 데이터베이스에 업로드 할 수 있습니다. 사용자는 하나의 이미지 또는 여러 이미지를 업로드 할 수 있으며 [UIImage] 형식으로 업로드됩니다. 그러나, 나는 자리 표시 자 이미지를 업로드하고 싶지 않습니다.UIImageView의 이미지가 자리 표시 자 이미지가 아니며 UIImage 배열에 추가됩니다.

나는 이것을 달성하기 위해 관리했지만 매우 비관적입니다. 이미지가 사용자 후 설정 한 때를 선택한

class ItemImageViewClass: UIImageView { 

//keeps track of whether the image has changed from the placeholder image. 
var isSet = Bool() 

} 다음

과 : 저는는 isset라는 속성을 추가하고이 클래스에 내 모든 이미지보기를 설정, 첫째로있는 UIImageView의 서브 클래스로 이런 짓을했는지 이미지의 경우 isSet 속성이 true로 설정됩니다.

var imageArray: [UIImage]? = nil 

    if imageViewOne.isSet { 
    guard let mainImage = imageViewOne.image else {return} 
     if (imageArray?.append(mainImage)) == nil { 
      imageArray = [mainImage] 
     } 
    } 
    if imageViewTwo.isSet { 
     guard let imageTwo = imageViewTwo.image else {return} 
     if (imageArray?.append(imageTwo)) == nil { 
      imageArray = [imageTwo] 
     } 
    } 

    guard imageArray != nil else { 
     print("imageArray is nil") 
     alertMessage("Hey!", message: "Please add some images!") 
     return 
    } 
적어도 하나 개의 이미지가 선택

배열 될 것이다 : 이미지보기 이미지 지정자 화상으로부터 변경된 경우

확인할 (즉 isSet == true) I는 다음과 같은 코드를 사용 데이터베이스에 저장됩니다.

이것은 매우 지저분한 방법처럼 보입니다. UIImageView를 서브 클래스 화하고 일련의 if 문을 사용하여 각 이미지가 변경되었는지 확인해야합니다. 이것을 달성하기위한보다 우아한 방법이 있습니까? 감사합니다

답변

0

서브 클래 싱을 피하기 위해 UIImageView을 확장하여 해결책이 있습니다. 그리고 filterflatMap을 사용하여 if 문을 전달하십시오. 이를 위해서는 각 UIImageView에 대해 동일한 위치 표시 자 이미지 참조를 사용해야합니다.

// In this example, the placeholder image is global but it doesn't have to be. 
let placeHolderImage = UIImage() 

extension UIImageView { 

    // Check to see if the image is the same as our placeholder 
    func isPlaceholderImage(_ placeHolderImage: UIImage = placeHolderImage) -> Bool { 
    return image == placeHolderImage 
    } 
} 

사용법 : 자리 또는 nil이 아닌 이미지에 대한

let imageViewOne = UIImageView(image: placeHolderImage) 
imageViewOne.isPlaceholderImage() // true 

let imageViewTwo = UIImageView() 
imageViewTwo.isPlaceholderImage() // false 

let imageViewThree = UIImageView() 
imageViewThree.image = UIImage(named: "my-image") 
imageViewThree.isPlaceholderImage() // false 

필터 및지도 : 확장이 요구 사항 작동하지 않는 경우

let imageArray = [imageViewOne, imageViewTwo, imageViewThree].filter 
{ !$0.isPlaceholderImage() }.flatMap { $0.image } 

print(imageArray) // imageViewThree.image 

것은, 확실히 고려할 것 " filter and flatMap "을 사용하여 if 문을 피할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 제 접근 방식보다 낫습니다. 나는 코드의 마지막 부분에서 머리를 감싸기 위해 고심하고있다. 나는이 사용 예제에서'.filter'가'.isPlaceholderImage'에 대한 반환 값이 false 인 이미지 뷰를 제거 할 것이라는 것을 이해 합니다만,'.flatMap {$ 0.image}'do 여기서? 내가 요소의 이미지에 액세스하고 그것을 imageArray에 추가한다고 생각하는 것이 맞습니까? 나는'.map'이 그것에 사용될 것이라고 생각 했을까? –

+1

flatMap은 배열에서 모든 선택 사항을 제거합니다. –

0

배경 UIImageView (자리 표시 자) 및 선택적 전경 UIImageView (사용자 선택)로 사용자의 새로운 UI 구성 요소를 만드는 것이 좋습니다. 그런 다음 사용자가 선택한 이미지가 포함 된 UIImageView라는 것에 의존 할 수 있으므로 선택적 전경 UIImageView의 존재를 확인하십시오.