使用UIButton从其他UIViewController中删除一行

时间:2015-05-13 12:33:03

标签: ios objective-c uitableview uiviewcontroller uibutton

我有一个问题,我有一个UITableViewController,其中有一个列表,当我按下一行时,它会将我发送给另一个UIViewController

我用prepareForSegue方法实现了这个,我也放了

- (void)tableView:(UITableView *)tableView commitEditingStyle:

当我滑动一行时正在删除。一切都很完美。

现在,我的问题是,我在UIViewController中添加了一个UIButton,我希望当我按下这个来删除UITableViewController中的行时,该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用委托,因为您希望在两个视图控制器之间进行通信。

在DetailViewController中创建协议。当您最初从TableViewController转换为DetailViewController时,将“idx”设置为选定的indexPath.row或数组索引。

当您从DetailViewController中删除它时,委托会将索引发送到TableViewController,您可以将其从主阵列中删除。

DetailViewController.h文件

    #import <UIKit/UIKit.h>


  @protocol DetailViewControllerDelegate <NSObject>

  @optional
  -(void) removeElementAt:(int )index;
  @end

  @interface DetailViewController : UIViewController{

        IBOutlet UIButton *bttn;
        id <DetailViewControllerDelegate> delegate;

    }

    @property (retain) int idx;

    @property (retain) id delegate;

    -(IBAction)bttnclicked;
    -(IBAction)back:(id)sender;

    @end

在DetailViewController.m文件中

 #import "DetailViewController.h"
    #import "TAbleViewController.h"

    @interface DetailViewController ()

    @end

    @implementation DetailViewController

    @synthesize idx,delegate;

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }



          - (void)viewDidLoad
            {
                [super viewDidLoad];
                // Do any additional setup after loading the view from its nib.
            }

            - (void)didReceiveMemoryWarning
            {
                [super didReceiveMemoryWarning];
                // Dispose of any resources that can be recreated.
            }

            -(IBAction)bttnclicked{
               [[self delegate] removeElementAt:idx];
            }

            -(IBAction)back:(id)sender{
                [self dismissViewControllerAnimated:YES completion:NULL];
            }

            @end

对于TableViewContoller.h文件

 #import <UIKit/UIKit.h>
   #import "DetailViewController.h"

    @interface TableViewContoller : UIViewController <DetailViewControllerDelegate>
    {
        DetailViewController *secondview;

    }

    @end

在TableViewController.m文件中,

   #import "TableViewController.h"
   #import "DetailViewController.h"

   @interface TableViewController ()

                @end

                @implementation TableViewController

                - (void)viewDidLoad
                {
                    [super viewDidLoad];
                    // Do any additional setup after loading the view, typically from a nib.
                }

                - (void)didReceiveMemoryWarning
                {
                    [super didReceiveMemoryWarning];
                    // Dispose of any resources that can be recreated.
                }
                  -(void) removeElementAt:(int )index
            {
                NSLog(@"Before object : %@",self.objects);

                [self.objects removeObjectAtIndex:index];
                //reload table at your convinience
                NSLog(@"Removed object : %@",self.objects);

                [self.tableView reloadData];
            }


       - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([[segue identifier] isEqualToString:@"showDetail"]) {
            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
            DetailViewController *dc=[segue destinationViewController];
            dc.idx = (int) indexPath.row;
            dc.delegate = self;

        }
    }

答案 1 :(得分:0)

commitEditingStyle:会调整您正在查看的核心数据源。删除按钮应以相同的方式调整核心数据。

请看Apple's Documentation for creating and deleting managed objects

如果你正在删除数据,那么行会由你回到UITableViewController来表示并仍在查看行,那么你需要刷新数据。