좋아, 나는 새로운 딜레마가있다. 나는 S.O. 대답을 찾지 만 코드를 작동시킬 수없는 것 같습니다. 또한 많은 자습서 및 기타 리소스를 살펴 보았지만 도움이 될만한 것을 찾지 못했습니다.사용자 정의 tableview 셀에서 이미지의 선택된 상태를 유지하는 방법은 무엇입니까?
여기 거래가 있습니다. 사용자 정의 객체가있는 사용자 정의 셀이있는 tableview가 있습니다. 사용자 정의 셀에는 셀에 나열된 운송 유형이 사용되었는지 여부를 표시하기 위해 선택할 수있는 이미지가 들어 있습니다. 이미지가 회색으로 표시된 "선택 취소됨"상태에서 파란색의 "선택됨"상태로 변경됩니다 (또는 "선택됨"에서 "선택 취소됨"으로 되돌아갑니다). 이미지의 탭 제스처는 사용자가 "예"또는 "아니오"를 선택할 수있는 경고보기를 시작합니다. 그런 다음 경고보기에서 이미지가 "선택됨"또는 "선택 취소 됨"상태로 변경되며 기본적으로 확인 표시처럼 작동합니다. 이것은 모두 완벽하게 작동합니다. (이미지의 의도하지 않은 탭 제스처에 대한 보호 수단으로 경고보기를 추가했습니다.) 셀 스크롤링 동안 사라진 후 화상이 해제되고, 또 다시 나타나면
문제가 발생한다. 많은 사람들이이 문제에 대해 질문했습니다. 내가해야 할 것 같습니다 : (1) 선택을 유지하기 위해 변경할 수있는 배열을 설정하십시오. (2) 셀에 표시 할 내용을 cellForRowAtIndexPath에 몇 가지 수행하여 (3)과 어딘가에 이미지의 상태를 설정하십시오 선택되어 변경 가능한 배열에 추가 될 수 있습니다.
나는 주어진 답변에서 아이디어를 구현하려했지만 많은 사람들이 버튼이나 셀 액세서리를 사용합니다. 문제의 일부는 이미지에 제스처 인식기 및 경고 뷰 실행이 있으므로이 코드 중 일부를 구현하는 부분입니다. 또한 선택 사항을 nsuserdefaults로 저장하면 스크롤하는 동안 이미지의 상태가 유지됩니까? 아니면 두 문제를 별도로 처리해야합니까? (즉, 스크롤하는 동안 상태를 유지하는 코드와 nsuserdefaults에 저장할 코드를 추가하십시오.) 나는 S.O.를 시도했다. nususerdefaults 사용에 대한 대답은 같지만 동일한 문제가 있습니다 ...이 코드는 어디에 두어야합니까? 버튼 상태 또는 셀 액세서리 상태를 저장하는 대신 이미지 상태를 저장하려면 어떻게합니까?
또한 tableview가 내비게이션 컨트롤러에 내장되어 있고 각 셀이 didSelectCellAtIndexPath (대부분의 S.O. 응답에 포함)에 코드를 추가 할 때 문제를 추가하는 세부 정보보기로 이동한다는 점에 유의하고 싶습니다. 전체 셀이 아닌 탭핑 된 이미지를 선택하는 방법 (종종 이미지 선택과 함께 세그가 발생합니다).
모든 종류의 도움을 받으실 수 있습니다 !! 미리 감사드립니다. :)
아래는 내 모든 코드 :
**TRANSPORT.h**
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface Transport : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) UIImage *transportImage;
@property (nonatomic, strong) UIImage *usedTransportImage;
@end
**TRANSPORTDATACONTROLLER.h**
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "Transport.h"
@interface TransportDataController : NSObject
@property (nonatomic, strong) NSMutableArray *transportDataArray;
-(NSMutableArray *)populateDataSource;
@end
**TRANSPORTDATACONTROLLER.m**
#import "TransportDataController.h"
@implementation TransportDataController
-(NSMutableArray *)populateDataSource
{
_transportDataArray = [[NSMutableArray alloc] init];
Transport *transportData = [[Transport alloc] init];
transportData.name = @"Bus";
transportData.transportImage = [UIImage imageNamed:@"Bus"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Helicopter";
transportData.transportImage = [UIImage imageNamed:@"Helicopter"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Truck";
transportData.transportImage = [UIImage imageNamed:@"Truck"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Boat";
transportData.transportImage = [UIImage imageNamed:@"Boat"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Bicycle";
transportData.transportImage = [UIImage imageNamed:@"Bicycle"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Motorcycle";
transportData.transportImage = [UIImage imageNamed:@"Motorcycle"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Plane";
transportData.transportImage = [UIImage imageNamed:@"Plane"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Train";
transportData.transportImage = [UIImage imageNamed:@"Train"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Car";
transportData.transportImage = [UIImage imageNamed:@"Car"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Scooter";
transportData.transportImage = [UIImage imageNamed:@"Scooter"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
transportData = [[Transport alloc] init];
transportData.name = @"Caravan";
transportData.transportImage = [UIImage imageNamed:@"Caravan"];
transportData.usedTransportImage = [UIImage imageNamed:@"stamp-grayed"];
[_transportDataArray addObject:transportData];
return _transportDataArray;
}
@end
**TRANSPORTCELL.h**
#import <UIKit/UIKit.h>
@interface TransportCell : UITableViewCell
@property (nonatomic, weak) IBOutlet UILabel *nameLabel;
@property (nonatomic, weak) IBOutlet UIImageView *transportImageView;
@property (nonatomic, weak) IBOutlet UIImageView *grayedImageView;
@end
**MAINTABLEVIEWCONTROLLER.h**
#import <UIKit/UIKit.h>
#import "Transport.h"
#import "TransportDataController.h"
#import "DetailTableViewController.h"
@interface MainTableViewController : UITableViewController
@property (nonatomic, strong) TransportDataController *transportController;
@property (nonatomic, strong) NSMutableArray *dataSource;
@end
**MAINTABLEVIEWCONTROLLER.m**
#import "MainTableViewController.h"
#import "TransportCell.h"
@interface MainTableViewController()
@end
@implementation MainTableViewController
-(void)viewDidLoad
{
[super viewDidLoad];
_transportController = [[TransportDataController alloc] init];
self.dataSource = _transportController.populateDataSource;
self.title = @"Transportation Types";
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _dataSource.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"mainCell";
TransportCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[TransportCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
Transport *transportData = [self.dataSource objectAtIndex:indexPath.row];
cell.nameLabel.text = transportData.name;
cell.transportImageView.image = transportData.transportImage;
cell.grayedImageView.image = transportData.usedTransportImage;
UITapGestureRecognizer *grayedImageTouched = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(transportImageTapped:)];
grayedImageTouched.numberOfTapsRequired = 1;
[cell.grayedImageView addGestureRecognizer:grayedImageTouched];
cell.grayedImageView.userInteractionEnabled = YES;
return cell;
}
-(void)transportImageTapped:(UIGestureRecognizer *)gesture
{
UIImageView *selectedImageView = (UIImageView *)[gesture view];
UIImage *grayedImage = [UIImage imageNamed:@"stamp-grayed"];
UIImage *darkImage = [UIImage imageNamed:@"stamp-color"];
UIAlertController *transportAlert = [UIAlertController alertControllerWithTitle:@"Yes, it's true..." message:@"I have used this type of transport before." preferredStyle:UIAlertControllerStyleAlert];
[transportAlert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){
NSLog(@"cancel");
}]];
[transportAlert addAction:[UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
if (selectedImageView.image == grayedImage)
{
selectedImageView.image = grayedImage;
[selectedImageView setImage:grayedImage];
}
else
{
selectedImageView.image = darkImage;
[selectedImageView setImage:darkImage];
}
if (selectedImageView.image == darkImage)
{
selectedImageView.image = darkImage;
[selectedImageView setImage:darkImage];
}
else
{
selectedImageView.image = grayedImage;
[selectedImageView setImage:grayedImage];
}
NSLog(@"has taken this transport before");
}]];
[transportAlert addAction:[UIAlertAction actionWithTitle:@"No" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
if (selectedImageView.image == darkImage)
{
selectedImageView.image = grayedImage;
[selectedImageView setImage:grayedImage];
}
else
{
selectedImageView.image = grayedImage;
[selectedImageView setImage:grayedImage];
}
if (selectedImageView.image == grayedImage)
{
selectedImageView.image = grayedImage;
[selectedImageView setImage:grayedImage];
}
NSLog(@"has not taken this transport before");
}]];
[self presentViewController:transportAlert animated:YES completion:nil];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showDetail"])
{
DetailTableViewController *detailController = [segue destinationViewController];
detailController.transport = [self.dataSource objectAtIndex:[self.tableView indexPathForSelectedRow] .row];
}
}
@end
, 당신은 이미지가 어두워 하시겠습니까? 현재로서는 "예"블록이 실제로 아무 것도하지 않는 것처럼 보입니다 ... –
@ Lyndsey ... Ah! 이것은 내가 언급하는 것을 잊었던 것이다. 방정식에 경고보기를 추가하면 부울 논리가 이상해져 작동하지 않습니다. 위의 코드는 내가 생각해 낸 것입니다. 마치 실제로는 보이지 않더라도 완벽하게 작동합니다. 그 문제는 나에게 꽤 오랫동안 고뇌를 안겨 줬다. 하지만 질문에 대답하기 위해 "예"를 선택하면 이미지가 회색으로 표시되지 않고 어둡게 표시됩니다. – IWannaLearn
좋아, 그게 내가 생각한거야. 내 대답을 확인한 다음 로직을 단순화하는 방법을 확인하십시오. –