已经设法通过tableview将输入文本从第一个VC传递到第二个VC。 第一个VC没有tableview。
第一个VC: UItextField - 用户键入一些名称。 UIButton * add - 带segue的按钮(prepareForSegue)
第二个VC: TableView使用prepareForSegue显示来自第一个VC的输入文本
问题: Tableview当时只显示一行,所以当我单击返回以输入另一个名称,然后单击添加按钮时,tableview显然会重置并且不记得第一个输入文本。那么如何让tableview记住名称并将其放在其他行中。我不知道我应该在prepareForSegue中输入代码,还是在第一个VC中创建委托。请详细解释。谢谢你。
答案 0 :(得分:0)
我相信有很多方法可以实现这一目标,如果你想坚持数据可能核心数据是你最好的选择,但是如果它只是一个简单的逻辑,那么我建议你使用代表。
<强>接口强>
@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
<强>接口强>
@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
的模型中提取结果,通过某种实时观察,从模型向外发出的通知或通过其他方式完全无关紧要来做到这一点。
(*有关您使用遏制的警告,例如视图控制器具有的标题的更改,但导航控制器显示的标题在技术上是正在进行的对话)