目标C - 使用tableview将数据从第二个VC传递到第一个VC

时间:2014-06-24 12:57:44

标签: ios iphone objective-c uitableview uiviewcontroller

已经设法通过tableview将输入文本从第一个VC传递到第二个VC。 第一个VC没有tableview。

第一个VC: UItextField - 用户键入一些名称。 UIButton * add - 带segue的按钮(prepareForSegue)

第二个VC: TableView使用prepareForSegue显示来自第一个VC的输入文本

问题: Tableview当时只显示一行,所以当我单击返回以输入另一个名称,然后单击添加按钮时,tableview显然会重置并且不记得第一个输入文本。那么如何让tableview记住名称并将其放在其他行中。我不知道我应该在prepareForSegue中输入代码,还是在第一个VC中创建委托。请详细解释。谢谢你。

2 个答案:

答案 0 :(得分:0)

我相信有很多方法可以实现这一目标,如果你想坚持数据可能核心数据是你最好的选择,但是如果它只是一个简单的逻辑,那么我建议你使用代表。

的ViewController

<强>接口

@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UITextField *dataTextField;
@property (nonatomic) NSMutableArray *items;
- (IBAction)AddData:(id)sender;
@end

<强>实施

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _items = [[NSMutableArray alloc]init];
}

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

- (IBAction)AddData:(id)sender {
    if ([self.dataTextField.text length]> 0) {
        [_items addObject:self.dataTextField.text];
        [self performSegueWithIdentifier:@"tableSegue" sender:self];
    }else{
       UIAlertView *alertView =  [[UIAlertView alloc]initWithTitle:@"Error"
                                                           message:@"You must enter some data"
                                                          delegate:self
                                                 cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alertView show];
    }

}




- (void)addItemViewController:(TableViewController *)controller didFinishSelectingItem:(NSMutableArray *)item selectedTag:(int)tag{
    NSLog(@"DATA=%@", item);
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"tableSegue"]){
        TableViewController *controller = (TableViewController *)segue.destinationViewController;
        controller.items = _items;
    }
}
@end

TableViewController

<强>接口

@protocol TableViewControllerDelegate <NSObject>
- (void)addItemViewController:(id)controller didFinishSelectingItem:(NSMutableArray *)item selectedTag:(int)tag;
@end

@interface TableViewController : UITableViewController
@property (nonatomic, weak) id <TableViewControllerDelegate> delegate;
@property (nonatomic) NSMutableArray *items;
@end

<强>实施

@implementation TableViewController

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
     [self.navigationController popViewControllerAnimated:YES];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    [[cell textLabel] setText:_items[indexPath.row]];
    return cell;
}

@end

答案 1 :(得分:0)

视图控制器是应用程序控制器层的一部分。他们不做商业逻辑&#34; - 大量处理或更持久的数据存储,无论是磁盘还是仅用于该会话。

您的应用程序的模型部分处理它。每个视图控制器都通过模型获取和设置数据。视图控制器之间不应该进行持续的对话*;除了你要指定给init的东西之外的任何东西都表明设计已经破裂。

所以你提出了错误的问题。

你会有一个模型以某种方式出售应该进入第一个视图控制器的项目。您将拥有第二个视图控制器,它知道如何编辑一个项目。从第一个到第二个的通信级别将是&#34;这是您应该编辑的项目&#34;。

第一个视图控制器和模型的责任是确保它可以使其显示保持最新。第二个视图控制器仅负责修改其记录。它不应该与第一个视图控制器进行任何通信。

你是否通过从每个viewWillAppear的模型中提取结果,通过某种实时观察,从模型向外发出的通知或通过其他方式完全无关紧要来做到这一点。

(*有关您使用遏制的警告,例如视图控制器具有的标题的更改,但导航控制器显示的标题在技术上是正在进行的对话)