在解除ViewController时从tableView中删除行和对象

时间:2014-09-02 10:28:41

标签: ios objective-c iphone uitableview

我是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

1 个答案:

答案 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