【问题标题】:Objective C - Passing data from second VC with tableview to first VCObjective C - 将数据从第二个 VC 与 tableview 传递到第一个 VC
【发布时间】:2014-06-24 12:57:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我唯一的问题是第二个 VC 不“记住”输入文本,只需将它们添加到数组中。
  • 输入文本/prepareForSegue/SecondVC/NSMutableArray/myCell.textLabel.text = array [indexPath.row]; - 这是输入文本的路径,NSMutableArray 中已经有输入文本

标签: ios iphone objective-c uitableview uiviewcontroller


【解决方案1】:

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

视图控制器

界面

@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

【讨论】:

  • meda,我在哪里可以买到晚餐? :),尝试了您的代码并对其进行了一些调整,我向您学习了很多关于代表的知识,谢谢
  • @keewee23 我会喝啤酒的兄弟;)但你可以approve the answer
  • 我确实同意了,但我还有另一个问题,我知道现在我开始对 a** 感到痛苦,这是我保证的最后一个问题 :),用于反向显示行, (在顶部)我必须反转数组中的对象,我知道该怎么做,但是有更简单的方法吗?谢谢
  • 谢谢,@keewee23 颠倒顺序,将此行放入 viewdidLoad dataSourceArray = [[_items reverseObjectEnumerator] allObjects];。没问题,这是一个问答网站,如果您再次需要我,请在此处发表评论
  • 非常感谢,稍加调整我就可以使用_items = [[[_items reverseObjectEnumerator] allObjects] mutableCopy]; :))
【解决方案2】:

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

您的应用程序的模型部分会处理这个问题。每个视图控制器都通过模型获取和设置数据。视图控制器之间不应该有正在进行的对话*;除了您指定给 init 的内容之外的任何内容都表明设计有问题。

所以你问错问题了。

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

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

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

(* 受制于您使用包含的警告,例如更改视图控制器具有但由导航控制器显示的标题在技术上是一个持续的对话)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2020-03-15
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多