繁体   English   中英

目标C-将数据从具有表视图的第二个VC传递到第一个VC

[英]Objective C - Passing data from second VC with tableview to first VC

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

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

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

问题:Tableview一次仅显示一行,因此当我单击返回以输入另一个名称并单击Add Buton时,Tableview显然会重置并且不记得第一个输入文本。 因此,如何使tableview记住名称并将其放在其他行中。 我不知道我应该在prepareForSegue中键入代码,还是在第一个VC中进行委托。 请详细说明。 非常感谢。

我相信有很多方法可以实现这一目标,如果您想持久化数据,也许核心数据是您最好的选择,但是如果它只是一个简单的逻辑,那么我建议您使用委托。

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

视图控制器是应用程序控制器层的一部分。 它们不执行“业务逻辑”-繁重的处理或更持久的数据存储(无论是磁盘还是仅用于该会话)。

应用程序的模型部分将处理此问题。 每个视图控制器都通过模型获取并设置数据。 视图控制器之间不应有正在进行的对话*; 您指定给init以外的任何事物都表明设计已损坏。

所以你问的是错误的问题。

您将拥有一个模型,该模型以某种方式出售应该进入第一个视图控制器的项目。 您将拥有另一个视图控制器,该控制器知道如何编辑一项。 从第一到第二的沟通水平是“这是您应编辑的项目”。

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

是否通过在每个viewWillAppear上从模型中提取结果,通过某种实时观察,通过模型向外发出的通知或通过其他某种方式来执行此操作都无关紧要。

(*受使用限制的警告的约束,例如,对视图控制器标题的更改,但导航控制器显示的标题,从技术上讲是正在进行的对话)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM