我是iOS新手,我遇到了问题。我有两个UIViewControllers
第一个是 ResponsesViewController (UITableView
),第二个是 DetailResponsesViewController 。当我在 ResponsesViewController 中选择一行时, DetailResponsesViewController 被推送
。作为我的后端,我正在使用parse.com。
ResponsesViewController 填充了Parse.com对象,当我选择一行时, DetailResponsesViewController 被选中行中的对象推送。我解决了这个问题,但是我在 DetailResponsesViewController 中有一个backButton,没有其他方法可以解除这个控制器,只有当用户点击backButton而没有其他方法如何删除对象时,只能在 DetailResponsesViewController中点击这个backButton。当点击按钮时,我想从parse.com删除对象,关闭控制器并从 ResponsesViewController 中删除对象(删除该对象的行),在下面的代码中,我有一些解决方案,但它不能正常工作,它每次从服务器删除对象,这是有效的,但它不会从UITableView
删除它,例如,我有10行,每第3行都没有删除,当我从 DetailResponsesViewController 回弹到tableView时,它仍然可以在tableView中看到但是从服务器中删除,当我从菜单中选择另一个VC并再次返回时,它会消失。
我尝试了很多解决方案,将[self.tableView reloadData]
放在大多数地方,但仍然只删除TableView中的行。
它的工作方式与SnapChat相同,但没有计时器:)当用户从tableView中读取消息时,会被删除。
有人知道,问题出在哪里,或者我使用的是错误的解决方案?非常感谢您的帮助。
我的代码
ResponsesViewController.h
@interface ResponsesViewController : UITableViewController
@property (nonatomic, strong) NSMutableArray *responses;
@property (nonatomic, strong) PFObject *selectedResponse;
@end
ResponsesViewController.m
@interface ResponsesViewController ()
@end
@implementation ResponsesViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self.tableView reloadData];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//getting the objects from parse.com
PFQuery *query = [PFQuery queryWithClassName:@"smajlici"];
[query whereKey:@"recieverFacebookiD" equalTo:[[PFUser currentUser] objectForKey:@"fbId"]];
[query orderByAscending:@"createdAt"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error){
NSLog(@"current user is %@", error);
} else {
//adding objects from server into MutableArray
self.responses = [objects mutableCopy];
[self.tableView reloadData];
}
}];
}
//------------------------------------------
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 69;
}
//------------------------------------------
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
//------------------------------------------
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.responses count];
}
//------------------------------------------
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"responseCell" forIndexPath:indexPath];
PFObject *object = [self.responses objectAtIndex:indexPath.row];
cell.textLabel.text = [object objectForKey:@"senderFbName"];
return cell;
}
//------------------------------------------
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
self.selectedResponse = [self.responses objectAtIndex:indexPath.row];
[self performSegueWithIdentifier:@"detailResponse" sender:self];
}
//------------------------------------------
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//sending object to DetailResponsesVC
if ([segue.identifier isEqualToString:@"detailResponse"]) {
DetailResponsesViewController *controller = (DetailResponsesViewController *)segue.destinationViewController;
controller.selectedResponse = self.selectedResponse;
}
}
@end
DetailResponsesViewController.h
@interface DetailResponsesViewController : UIViewController
@property (nonatomic, strong) PFObject *selectedResponse;
- (IBAction)backButton:(id)sender;
@end
DetailResponsesViewController.m
@interface DetailResponsesViewController ()
@end
@implementation DetailResponsesViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationController.navigationBar.hidden = YES;
}
- (IBAction)backButton:(id)sender {
//selectedresponse is an object sent to this viewController using SEGUE
//from "didselectrowAtIndexPath" ResponsesViewController
[self.selectedResponse deleteInBackground];
[self.navigationController popToRootViewControllerAnimated:YES];
}
@end
答案 0 :(得分:0)
您可以执行以下操作,只有在加载视图时才会获取新的Parse数据以保存常量Parse调用(然后添加UIRefreshControl以便您可以拉动以重新加载数据)并在表之前删除对象接下来就会显示出来。
ResponsesViewController.m
@interface ResponsesViewController ()
@end
@implementation ResponsesViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self loadParseData];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated]
[self.tableView reloadData];
}
-(void)loadParseData {
//getting the objects from parse.com
PFQuery *query = [PFQuery queryWithClassName:@"smajlici"];
[query whereKey:@"recieverFacebookiD" equalTo:[[PFUser currentUser] objectForKey:@"fbId"]];
[query orderByAscending:@"createdAt"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error){
NSLog(@"current user is %@", error);
} else {
//adding objects from server into MutableArray
self.responses = [objects mutableCopy];
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}
}];
}
//------------------------------------------
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 69;
}
//------------------------------------------
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
//------------------------------------------
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.responses count];
}
//------------------------------------------
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"responseCell" forIndexPath:indexPath];
PFObject *object = [self.responses objectAtIndex:indexPath.row];
cell.textLabel.text = [object objectForKey:@"senderFbName"];
return cell;
}
//------------------------------------------
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
self.selectedResponse = [self.responses objectAtIndex:indexPath.row];
[self.responses removeObject:self.selectedResponse];
[self performSegueWithIdentifier:@"detailResponse" sender:self];
}
//------------------------------------------
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//sending object to DetailResponsesVC
if ([segue.identifier isEqualToString:@"detailResponse"]) {
DetailResponsesViewController *controller = (DetailResponsesViewController *)segue.destinationViewController;
controller.selectedResponse = self.selectedResponse;
}
}
@end