2015-05-13 2 views
0

У меня вопрос, у меня есть UITableViewController, у которого есть список с чем-то. Когда я нажимаю на строку, он посылает меня в другой UIViewController.Удалите строку из другого UIViewController с UIButton

Я реализовал это с prepareForSegue методом также я поставил

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

, когда я салфетку строки удаления. Все работает отлично.

Теперь, на мой вопрос, я поставил UIButton в UIViewController, и я хочу, когда я нажимаю на это, чтобы удалить строку из UITableViewController, как это сделать?

+0

Если вы понимаете правильно, вы хотите, чтобы при щелчке по строке и нажатии на второй контроллер запись на ленту в первом контроллере должна быть удалена? –

+0

Да, правильно ..... –

+0

Если вы положили 'UIButton' на' UIViewController', то что это такое? –

ответ

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; 

     } 
    } 
+0

Спасибо за ваш повтор ... Я попытаюсь ... –

+0

Работает в совершенстве!!! Благодаря!!!! –

0

commitEditingStyle: регулирует основной источник данных того, что вы просматриваете. Кнопка удаления должна точно настроить основные данные.

Посмотрите на Apple's Documentation for creating and deleting managed objects.

Если вы удаляете данные, которые строка представляет и продолжает просматривать строку при нажатии на UITableViewController, вам необходимо обновить данные.

+0

Нет, commitEditingStyle работает нормально, у меня есть два режима просмотра, сначала UITableView, второй - UIViewController, второй - кнопка, и я хочу, чтобы при нажатии на строку, чтобы удалить строка, которую я выбрал из firstViewController, и отодвинуть назад в tableList. –

+0

Я все еще не совсем понимаю вашу грамматику, но предполагаю, что вы хотите удалить объект данных, отображаемый UIViewController. 'commitEditingStyle' делает это в фоновом режиме. Это я и говорил. Ваше удаление UIButton необходимо удалить объект, отображаемый вашим UIViewController из UIManagedObjectContext. '[aContext deleteObject: aManagedObject];' будет делать это. Предполагается, что вы используете CoreData для своего приложения. – Andrew

+0

Где в UITableViewController вы обновляете отображаемые данные? – Andrew

Смежные вопросы