nsmutablearray - 从前一个 View Controller 中的数组中获取数据,将其放入另一个 TableViewController

标签 nsmutablearray uitableview xcode4.3

我有 2 个 TableViewController。当用户点击 UIBarButtonItem 时,它会在 SaveViewController 中保存 UITextField、runnameField 中的文本。它应该获取 runnameField 的文本并将其放入一个数组中,runsArray。在RecordVC 中,tableView 的数据应该来自runsArray。
有人可以帮我解决这个问题吗?我已经在谷歌上搜索了很长时间,找不到任何答案。

保存 View Controller .h:

#import <UIKit/UIKit.h>
#import "RecordsViewController.h" //Next ViewController

@interface SaveViewController : UITableViewController <UITableViewDataSource,UITableViewDelegate> {
__weak IBOutlet UITextField *runnameField;
RecordsViewController *RecordsVCData;
}
@property (weak, nonatomic) IBOutlet UITextField *runnameField;
@property (weak, nonatomic) IBOutlet UITextView *runnotesTextView;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *saveBarItem;
@property (nonatomic, retain) RecordsViewController *RecordsVCData;

- (IBAction)saverun:(UIBarButtonItem *)sender;
- (IBAction)goAwayKeyboard:(id)sender;



@end

保存 View Controller .m:
- (IBAction)saverun:(UIBarButtonItem *)sender {
RecordsViewController *RecordsVC = [[RecordsViewController alloc] initWithNibName:nil bundle:nil];
RecordsVC.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
self.RecordsVCData = RecordsVC;
[RecordsVC.runsArray addObject:[NSString stringWithFormat:@"%@", runnameField.text]];
[self presentModalViewController:RecordsVC animated:YES];
}

- (IBAction)goAwayKeyboard:(id)sender {
    [sender resignFirstResponder];
}

记录 View Controller .h:
#import <UIKit/UIKit.h>
@interface RecordsViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> {      
NSMutableArray *runsArray;
}
@property (weak, nonatomic) NSString *runname;
@property (strong, nonatomic) NSString *runnotes;
@property (weak, nonatomic) UITableViewCell *cell;
@property (retain,nonatomic) NSMutableArray *runsArray;
@end

RecordsViewController.m:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:     (NSIndexPath *)indexPath {

// Identifier for retrieving reusable cells.
static NSString *cellIdentifier = @"MyCellIdentifier";

// Attempt to request the reusable cell.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault     reuseIdentifier:cellIdentifier];
// No cell available - create one
if(cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:cellIdentifier];
[cell.textLabel setText:[NSString stringWithFormat:@"%@",[runsArray objectAtIndex:indexPath.row]]];

}

// Set the text of the cell to the runnamestring.
[cell.textLabel setText:[NSString stringWithFormat:@"%@",[runsArray objectAtIndex:indexPath.row]]];
return cell;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [runsArray count];
}

任何帮助都非常感谢。

谢谢,

德鲁夫

最佳答案

在您更新 RecordsVC.runsArray 时,我想您的 tableview 已经被初始化和加载,尽管没有数据。

我最近在这种情况下所做的就是使用通知。

在 RecordsViewController 中,您将在 init 方法中注册通知:

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

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataLoaded:) name:@"runsArrayLoaded" object:nil];

        // Custom initialization
    }
    return self;
}

同样在 RecordsViewController 中,您将需要在收到通知时调用的方法。在这种情况下,它是 dataLoaded:
-(void) dataLoaded:(NSNotification *)notif {
    if (notif.userInfo){
        runsArray = [notif.userInfo objectForKey:@"newdata"];
        [self.tableview reloadData];
    }
}

使所有这些魔法起作用的部分是在 SaveViewController 类中的 saverun 方法中。
- (IBAction)saverun:(UIBarButtonItem *)sender {
    RecordsViewController *RecordsVC = [[RecordsViewController alloc] initWithNibName:nil bundle:nil];
    RecordsVC.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
    [runsArray addObject:[NSString stringWithFormat:@"%@", runnameField.text]];
    [self presentModalViewController:RecordsVC animated:YES];

    // notify the RecordsViewController that new data is available
    NSMutableDictionary* userInfo = [[NSMutableDictionary alloc] initWithCapacity:1];
    [userInfo setObject:runsArray forKey:@"newdata"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@runsArrayLoaded" object:nil userInfo:(NSDictionary*)userInfo];
}

最后,您必须清理并删除 RecordsViewController 类中的通知观察。在您的 viewWillDisappear 中,添加以下行:
[[NSNotifcation defaultCenter] removeObserver:self name:@"runsArrayLoaded" object:nil];

关于nsmutablearray - 从前一个 View Controller 中的数组中获取数据,将其放入另一个 TableViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13333952/

相关文章:

iphone - 无法从 NSXMLParser 解码 UTF8 字符

ios - 采用Objective-C协议(protocol)并返回NSArray

ios cellForRowAtIndexPath 不会被调用,但是 numberOfRowsInSection 会被调用并返回一个数字

ios - Storyboard中的自定义segue

ios - 单元测试时的链接器错误 : ld: illegal text-relocation to cstring in . .. from _av_image_check_size in .../libavutil.a(imgutils.o)

iphone - 何时对 NSMutableArray 使用 mutableCopy

objective-c - 如何将事件对象添加到 NSMutableArray 并在它们被释放时删除它们?

ios - 即使应用程序在后台运行,如何使用通知信息更新 TableView?

ios - 在另一行删除动画之后插入行

ios - 如何在 Xcode 4.3 上查看复制到构建文件夹的资源?