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

Posted

技术标签:

【中文标题】使用 UIButton 从其他 UIViewController 中删除一行【英文标题】:Delete a row from other UIViewController with a UIButton 【发布时间】:2015-05-13 12:33:02 【问题描述】:

我有一个问题,我有一个UITableViewController,其中有一个列表,当我推动一行时,它会将我发送到另一个UIViewController

我也用prepareForSegue 方法实现了这个

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

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

现在,我的问题是,我在UIViewController 中放置了一个 UIButton,并且我想在我按下它时删除来自UITableViewController 的行,该怎么做?

【问题讨论】:

如果我理解正确你希望当你点击行并推送到第二个控制器时,第一个控制器中的录音行应该被删除? 如果把UIButton放在UIViewController上,那有什么用呢? 当我点击行并推到第二个控制器时,当我点击按钮从第一个控制器中删除录制的行时......就在我点击按钮时...... UIButton 是在第二个视图控制器上还是在第一个视图控制器上? 当您删除数据时,它是否也会从您的数据库中删除? 【参考方案1】:

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

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

当你从 DetailViewController 中删除它时,delegate 会将索引发送到 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;

        
    

【讨论】:

【参考方案2】:

commitEditingStyle: 调整您所查看内容的核心数据源。删除按钮应该以同样的方式调整核心数据。

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

如果您正在删除该行所代表的数据,并且在您推回 UITableViewController 时仍然查看该行,那么您需要刷新数据。

【讨论】:

不,commitEditingStyle 工作正常,我有两个 viewController,第一个是 UITableView,第二个是 UIViewController,第二个我有按钮,我希望当我按下行时删除我的行从 firstViewController 中选择并推回 tableList。 我还是不太明白你的语法,但我假设你想删除 UIViewController 正在显示的数据对象。 commitEditingStyle 在后台执行此操作。我就是这么说的。您的删除 UIButton 需要从 UIManagedObjectContext 中删除您的 UIViewController 正在显示的对象。 [aContext deleteObject:aManagedObject]; 会这样做。这是假设您在应用中使用 CoreData。 您在 UITableViewController 的哪个位置刷新显示的数据? 在 viewWillAppear 我放了一个 [self.tableView reloadData]; 确保在主队列上刷新,并且在刷新之前将删除提交到对象上下文。 ***.com/questions/24939434/…

以上是关于使用 UIButton 从其他 UIViewController 中删除一行的主要内容,如果未能解决你的问题,请参考以下文章

从其他视图更新 UIButton 标题...?

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

如何从数组中过滤多个选定值并将其从 uibutton 加载到其他 uitableview

从 UITableViewCell 中的 UIButton 触发 Segue

从 UIButton 按下处理程序获取关联 UIView 的最简洁方法

将事件从 UIScrollView 转发到 UIButton