как заменить изображения выбранными пользователем фотографиями

#arrays #swift

#массивы #swift

Вопрос:

  var images      : [UIImage?] = [nil, nil, nil, nil, nil]

 
 

У меня есть массив изображений. Я хочу заменить ноль на изображение с помощью кнопки sender.tag

 @IBAction func addImage(_ sender: UIButton) {
        var configuration = PHPickerConfiguration()
        configuration.selectionLimit = 1
        configuration.filter = .any(of: [.images])
        
        let picker = PHPickerViewController(configuration: configuration)
        picker.delegate = self
        self.present(picker, animated: true, completion: nil)
 

Добавить кнопки изображения

Если array[index] равен нулю, показать изображение.
Но array [index] — это фотография, показать фотографию

 extension EditViewController: PHPickerViewControllerDelegate {
    @available(iOS 14, *)
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        picker.dismiss(animated: true, completion: nil)
        
        let itemProvider = results.first?.itemProvider
        
        if let itemProvider = itemProvider,
           itemProvider.canLoadObject(ofClass: UIImage.self) {
            itemProvider.loadObject(ofClass: UIImage.self) { (object, error) in
                if let image = object as? UIImage {
                    DispatchQueue.main.async {
                        print("image: (image)")
                        
                        
                        print("IMAGES ARRAY : (self.images)")
                        
                    }
                }
                
            }
        } else {
            //
        }
        
    }
}
 

Этот код является PHPicerViewControllerDelegate (https://ikyle.me/blog/2020/phpickerviewcontroller )

Комментарии:

1. используйте выбранный индекс при нажатии кнопки добавить и поместите изображение в выбранный индекс

Ответ №1:

вы можете сделать это с помощью следующего метода назначьте теги своим UIButtons и при действии UIButton добавьте свое изображение в определенный индекс массива, управляя объектом

например

 var selectedIndex or selectedTag // of your UIButton
 

при нажатии кнопки обновите значение SelectedIndex на

self.SelectedIndex = sender.tag

затем в вашем методе didFinishPicking обновите массив изображений выбранным изображением в SelectedIndex и обновите изображения кнопок следующим образом

 images.insert(yourSelectedImage, at: selectedIndex)
self.setImagesForButtons()
 

теперь назначьте выбранное изображение UIButton с помощью UIButton Outlet
, например, у вас есть пять выходов для ваших пяти кнопок

 @IBOutlet weak var yourButtonOutlet1: UIButton!
@IBOutlet weak var yourButtonOutlet2: UIButton!
@IBOutlet weak var yourButtonOutlet3: UIButton!
@IBOutlet weak var yourButtonOutlet4: UIButton!
@IBOutlet weak var yourButtonOutlet5: UIButton!



 func setImagesForButtons()
    {
        if (self.selectedIndex == 0)
        {
            if (images[selectedIndex] != nil)
            {
                
                self.yourButtonOutlet1.setImage(images[selectedIndex], for: .normal)
            }
            else
            {
                // set plus icon image to your button
            }
        }
        else if (self.selectedIndex == 1)
        {
            if (images[selectedIndex] != nil)
            {
                
                self.yourButtonOutlet2.setImage(images[selectedIndex], for: .normal)
            }
            else
            {
                // set plus icon image to your button
            }
        }
        else if (self.selectedIndex == 2)
        {
            if (images[selectedIndex] != nil)
            {
                
                self.yourButtonOutlet3.setImage(images[selectedIndex], for: .normal)
            }
            else
            {
                // set plus icon image to your button
            }
        }
        else if (self.selectedIndex == 3)
        {
            if (images[selectedIndex] != nil)
            {
                
                self.yourButtonOutlet4.setImage(images[selectedIndex], for: .normal)
            }
            else
            {
                // set plus icon image to your button
            }
        }
        else if (self.selectedIndex == 4)
        {
            if (images[selectedIndex] != nil)
            {
                
                self.yourButtonOutlet5.setImage(images[selectedIndex], for: .normal)
            }
            else
            {
                // set plus icon image to your button
            }
        }
    }
 

Ответ №2:

Вы можете использовать в сборке Средство выбора изображений

 extension EditProfileViewController: UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        
//        localUserData.ProfileImage = info[.originalImage] as? UIImage
        self.imgProfile.image = info[.originalImage] as? UIImage
        self.dismiss(animated: true, completion: {
            let yes = UIAlertAction(title: "Yes", style: .default, handler: { _ in
                self.imgProfile.image = self.localUserData.ProfileImage
            })
            let no = UIAlertAction(title: "No", style: .default, handler: nil)
            self.showCustomAlert(alertMsg: ValidationMsg.imageUpload.rawValue, actions: [yes,no])
        })
    }
}
 

Комментарии:

1. если вам нужна пользовательская функция оповещения, дайте мне знать

Ответ №3:

Правильный ответ был дан, просто хочу сделать его короче.

Каждая кнопка должна иметь тег от 0 до 4.

Затем вы можете создать свойство в своем контроллере. Пусть будет selectedIndex так . В дополнительном изображении вы должны добавить строку:

 @IBAction func addImage(_ sender: UIButton) {
    self.selectedIndex = _sender.tag
    ....
}
 

Затем в методе делегирования после получения изображения:

 images[selectedIndex] = image
let buttons = [button1, button2, button3, button4, button5]
let selectedButton = buttons[selectedIndex]

if (images[selectedIndex] != nil) {   
    selectedButton.setImage(images[selectedIndex], for: .normal)
}
else {
    selectedButton.setImage(imagePlus, for: .normal)
}