如何将数据传递给父视图IOS

时间:2012-11-06 14:49:03

标签: ios view nsmutablearray nsnotificationcenter

我知道每两天会问一次这个问题。我看不出我做错了什么。 我有一个基于故事板导航控制器的应用程序。

我的通知和pop / push segues运行良好,唯一的事情是我无法将字符串添加到父级视图NSmutablearray。

我想将一个字符串对象添加到父视图的nsmutablearray中。我体面的代码没有传递任何数据。

parent.h

@interface CreaatePlistTableViewController : UITableViewController<UITableViewDelegate, UITableViewDataSource>{

    NSMutableArray *presenterList;

}
@property (nonatomic, strong) NSMutableArray *presenterList;

parent.m

NSString * const NOTIF_CreatePlist_UpdateTableview= @"CreatePlist/UpdateTableview";
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Private interface definitions for update tableview
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
@interface CreaatePlistTableViewController (private)
- (void)CreatePlistUpdateTableview:(NSNotification *)notif;
@end

@implementation CreaatePlistTableViewController
@synthesize presenterList=_presenterList;

- (void)viewDidLoad
{
    [super viewDidLoad];

    _presenterList=[[NSMutableArray alloc] init];

    // Register observer to be called when logging out
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(CreatePlistUpdateTableview:)
                                                 name:NOTIF_CreatePlist_UpdateTableview object:nil];

    NSLog(@"Presenter List: %@", _presenterList);

}


- (void)CreatePlistUpdateTableview:(NSNotification *)notif{
    NSLog(@"Notification recieved");
    NSLog(@"Presenter List: %@", _presenterList);
    [_createPlistTableview reloadData];
}

child.h

@interface AddPresenterViewController : UITableViewController<UITextFieldDelegate,UIAlertViewDelegate>{
    CreaatePlistTableViewController *crereaatePlistTableViewController;
}
@property(nonatomic,strong) CreaatePlistTableViewController *crereaatePlistTableViewController;

child.m

@synthesize crereaatePlistTableViewController=_crereaatePlistTableViewController;
//finished adding presenter
-(IBAction)finishedAddingPresenter:(id)sender{

    //some xml string here
    NSLog(@"final result XML:\n%@", writer.XMLString);


    _crereaatePlistTableViewController=[[CreaatePlistTableViewController alloc]init];
    //add object to parents view data source
    [_crereaatePlistTableViewController.presenterList addObject:writer.XMLString];

    //dismiss the view
     [self.navigationController popViewControllerAnimated:YES];

    //notify the parent view to update its tableview

    [[NSNotificationCenter defaultCenter] postNotificationName:@"CreatePlist/UpdateTableview" object:nil];

}

输出

Notification recieved
Presenter List: (
)

单击按钮时通知会起作用。但它不会将对象传递给nsmutablearray。

我在这里做错了什么?如何将对象添加到父视图的nsmutablearray?

2 个答案:

答案 0 :(得分:0)

你写了这个。

[_crereaatePlistTableViewController.presenterList addObject:writer.XMLString];

你有没有初始化阵列?不。使用调试器,你会看到在这一行presenterList是nil。

现在作为一种风格点。避免使用NSNotificationCenter传递数据或发信号通知其他对象。 @TheRonin给了一个方便的链接。您还应该查看有关Segues的一些教程,因为这些是已解决的问题。

This is another related post that you might find interesting.

答案 1 :(得分:0)

似乎一切都很好,除了你的父视图对象的分配我不熟悉故事板,但你说你正在使用导航导航控制器

所以改变这个

 _crereaatePlistTableViewController=[[CreaatePlistTableViewController alloc]init];

 _crereaatePlistTableViewController= [self.navigationController.viewControllers objectAtIndex:0];

它可能有用我不确定