在模态视图后,TableView不会重新加载

时间:2014-04-24 01:18:46

标签: ios objective-c uitableview

我正在制作一个程序,我正在为iPad练习UIPopoverController'

在第一个popover中我有一个带有一些单元格的tableView,我想做的是用文本字段调用一个新视图,这样我就可以添加带有文本字段文本的新单元格。

我遇到的问题是当我关闭第二个视图时,tableView没有更新。我无法调用reloadData,因为第一个视图没有调用" viewWillAppear"任何其他人。

在iphone模拟器中,它运行良好,因为iphone不使用uiPopoverController但在iPad中我必须关闭第一个弹出窗口,而视图仅在我第二次进入时重新加载。

我知道通过阅读一些帖子可以使用通知中心来实现它但我不知道如何

我的代码就是这个

- 第一个视图,tableView

BNRAssetTypeViewController.h

#import <Foundation/Foundation.h>

@class BNRItem;

@interface BNRAssetTypeViewController : UITableViewController 

@property (nonatomic,strong) BNRItem *item;
@property (nonatomic, copy) void (^dismissBlock)(void);

@end

BNRAssetTypeViewController.m

#import "BNRAssetTypeViewController.h"
#import "BNRItem.h"
#import "BNRItemStore.h"
#import "BNRDetailViewController.h"
#import "AddNewAssetedTypeViewController.h"


@implementation BNRAssetTypeViewController

-(instancetype)init
{
//Chamar o designated initializer
self = [super initWithStyle:UITableViewStylePlain];
if (self) {

//Titulo
UINavigationItem *navItem = self.navigationItem;
navItem.title=@"New Asseted Type";

//Criar um novo bar button que faz novo item do lado direito
UIBarButtonItem *bbi =[[UIBarButtonItem    alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
                                                                   target:self  action:@selector(addNewAssetedType)];
//meter do lado direito
navItem.rightBarButtonItem=bbi;


}
return self;
}
-(instancetype)initWithStyle:(UITableViewStyle)style
{
return [self init];
}

-(void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"ViewDidLoad");
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];

 }

-(void)viewWillAppear:(BOOL)animated
 {
NSLog(@"ViewwillApear");

[self.tableView reloadData];
}
-(void)viewDidAppear:(BOOL)animated{
NSLog(@"ViewDidApear");
}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[[BNRItemStore sharedStore]allAssetTypes]count];
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath   *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell" forIndexPath:indexPath];

NSArray *allAssetTypes = [[BNRItemStore sharedStore]allAssetTypes];
NSManagedObject *assetType = allAssetTypes[indexPath.row];

// Use key-value coding to get the asset type's label
NSString *assetLabel = [assetType valueForKey:@"label"];
cell.textLabel.text = assetLabel;

// Checkmark the one that is currently selected
if (assetType == self.item.assetType) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType=UITableViewCellAccessoryCheckmark;



NSArray *allAssets = [[BNRItemStore sharedStore]allAssetTypes];
NSManagedObject *assetType = allAssets[indexPath.row];
self.item.assetType=assetType;

if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
    self.dismissBlock();
} else {
    [self.navigationController popViewControllerAnimated:YES];
}


}

-(void)addNewAssetedType{

AddNewAssetedTypeViewController *anatvc = [[AddNewAssetedTypeViewController alloc]init];
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:anatvc];


 navController.modalPresentationStyle=UIModalPresentationCurrentContext;

[self.navigationController presentViewController:navController animated:YES completion:nil];


}

- 第二个视图

AddNewAssetedTypeViewController.h

#import <UIKit/UIKit.h>

@interface AddNewAssetedTypeViewController : UIViewController <UITextFieldDelegate>
@property (nonatomic,copy) void (^dismissBlock)(void);

@end

AddNewAssetedTypeViewController.m

#import "AddNewAssetedTypeViewController.h"
#import "BNRItemStore.h"
#import "BNRAssetTypeViewController.h"

@interface AddNewAssetedTypeViewController ()


@property (weak, nonatomic) IBOutlet UITextField *textField;

@end

@implementation AddNewAssetedTypeViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    UIBarButtonItem *doneItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone
                                                                             target:self
                                                                             action:@selector(save:)];
    self.navigationItem.rightBarButtonItem=doneItem;

    UIBarButtonItem *cancelItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
                                                                               target:self action:@selector(cancel:)];
    self.navigationItem.leftBarButtonItem=cancelItem;

}
return self;
}


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

[self.view endEditing:YES];

[[BNRItemStore sharedStore] createAssetType:self.textField.text];



}

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

-(void)cancel:(id)sender
{

[self.presentingViewController dismissViewControllerAnimated:YES
                                                  completion:nil];
}
-(void)save:(id)sender
{

[self.presentingViewController dismissViewControllerAnimated:YES
                                                  completion:nil];

}

@end

1 个答案:

答案 0 :(得分:0)

OLA! 当弹出窗口中添加了某些内容时,您可以使用NSNotificationCenter触发通知。首先,注册第一个视图控制器以观察该通知。在第一个VC保留对观察者的引用,您将在稍后注册:

@implementation BNRAssetTypeViewController {
    id _observer;
}

在viewWillAppear中:

_observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"somethingAddedNotification"
                    object:nil
                     queue:nil
                usingBlock:^(NSNotification *notification)
{
     [self.tableView reloadData];
}];

在viewWillDisappear中:

- (void)viewWillDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] removeObserver:_observer];
}

然后在第二个视图控制器的方法save:中:

[[NSNotificationCenter defaultCenter] postNotificationName:@"somethingAddedNotification" object:nil];

免责声明:未经测试的代码。让我知道它是怎么回事。