在對於圖片上傳操作時,我們需要先將圖片展示給用戶,然後點擊按鈕將圖片上傳。那麼我們在點擊上傳按鈕的時候,如果用戶沒有進行更改,我們就直接上傳,要麼是是空圖片,要麼是原始的默認圖。而我們的目的是保證用戶選擇圖片並上傳,而不是上傳默認圖片。那麼怎麼區分圖片是否已經選擇好了呢? 對我而言,有兩種方法:
1.申明全局變量保存圖片 每當選擇一張圖片,就將圖片賦值給全局的變量進行保存,但是如果需要展示和上傳的圖片過多時, 不僅需要創建大量的全局變量,而且在選擇照片後還需要判定選擇的是第幾張
以展示和上傳兩張圖片爲例:
首先創建兩個全局變量 image1, image2
@interface ASDUploadForMenHuFragment () <UIActionSheetDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@property (weak, nonatomic) IBOutlet UIButton *cardFrontButton;
@property (weak, nonatomic) IBOutlet UIButton *co_Button;
@property (strong, nonatomic) UIImage *image1;
@property (strong, nonatomic) UIImage *image2;
@end
在選擇照片後,對照片選擇器的回調做處理
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
//當選擇的類型是圖片
//先把圖片轉成NSData
UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage];
//關閉相冊界面
__weak __typeof(self)weakSelf = self;
[picker dismissViewControllerAnimated:YES completion:^{
dispatch_async(dispatch_get_main_queue(), ^{
if (selectedButton == weakSelf.cardFrontButton) {
image1 = image;
[weakSelf.cardFrontButton setBackgroundImage:image forState:UIControlStateNormal];
} else if (selectedButton == weakSelf.co_Button) {
image2 = image;
[weakSelf.co_Button setBackgroundImage:image forState:UIControlStateNormal];
}
});
}];
}
點擊上傳按鈕的時候,我們進行判斷的標準則爲image1 與image2 是否爲空
- (void)uploadImage {
if (image1 == nil) {
NSLog(@"image1未選擇或更改");
return;
}
if (image2 == nil) {
NSLog(@"image2未選擇或更改");
return;
}
//以下爲選擇照片並更改後的操作的代碼
}
以上代碼雖然解決了驗證的問題,但是一旦展示和需要上傳的照片過多,則需要創建很多的全局變量保存,代碼會變得很冗長,且不好維護。
2.通過方法 setAccessibilityIdentifier ,設置標識符, 可減少代碼量及方便代碼閱讀
同樣以展示和上傳兩張照片爲例:
@interface ASDUploadForMenHuFragment () <UIActionSheetDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@property (weak, nonatomic) IBOutlet UIButton *cardFrontButton;
@property (weak, nonatomic) IBOutlet UIButton *co_Button;
@end
在viewdidLoad 方法中,我們設置展示按鈕圖片的默認標示
- (void)viewDidLoad {
[super viewDidLoad];
//設置圖片默認標識符 此處標識符可以隨意寫
[self.cardFrontButton.currentBackgroundImage setAccessibilityIdentifier:@"S_cardFront"];
[self.co_Button.currentBackgroundImage setAccessibilityIdentifier:@"S_RenZheng"];
}
在選擇完圖片之後,在照片選擇器的回調中,我們將默認的標識符進行改變
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
//當選擇的類型是圖片
//先把圖片轉成NSData
UIImage* image = [info objectForKey:UIImagePickerControllerOriginalImage];
//關閉相冊界面
__weak __typeof(self)weakSelf = self;
[picker dismissViewControllerAnimated:YES completion:^{
dispatch_async(dispatch_get_main_queue(), ^{
if (selectedButton == weakSelf.cardFrontButton) {
[weakSelf.cardFrontButton setBackgroundImage:image forState:UIControlStateNormal];
//改變默認圖片標識符
[weakSelf.cardFrontButton.currentBackgroundImage setAccessibilityIdentifier:@"imagePicked"];
} else if (selectedButton == weakSelf.co_Button) {
[weakSelf.co_Button setBackgroundImage:image forState:UIControlStateNormal];
//改變默認圖片標識符
[weakSelf.co_Button.currentBackgroundImage setAccessibilityIdentifier:@"imagePicked"];
}
});
}];
}
在uploadImage方法中,我們就可以根據以上的設置,找出標識符進行判斷
- (IBAction)uploadImageEvent:(UIButton *)sender {
//獲取相應的標識符
NSString *imageName1 = [self.cardFrontButton.currentBackgroundImage accessibilityIdentifier];
NSString *imageName2 = [self.co_Button.currentBackgroundImage accessibilityIdentifier];
//將標識符進行判斷
if ([imageName1 isEqualToString:@"S_cardFront"] && [imageName2 isEqualToString:@"S_RenZheng"]) {
ShowTips(@"請先選擇要上傳的照片");
return;
}
ShowIndicator_InView(self.view, @"正在上傳照片");
[self imageUpload];
}
以上我們就可以很好的進行圖片是否有過更改的判斷, 不需要創建一大堆的全局變量進行保存, 在上傳圖片的時候,就可以直接取相應控件的圖片值進行上傳。看起來還是即簡單也方便了很多。