Ios 如何替换视图控制器而不丢失数据
我有两个UIViewController,一个是UIPickerViewController,另一个是UITableViewController。理想情况下,选择器应该从用户那里得到一个请求,向tableView中添加x个数量的项目。选择器获取用户输入并将其分配给变量val1、val2、val3,其中val1是项目数(行数),val2是项目的名称或标签 PickerViewController.mIos 如何替换视图控制器而不丢失数据,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有两个UIViewController,一个是UIPickerViewController,另一个是UITableViewController。理想情况下,选择器应该从用户那里得到一个请求,向tableView中添加x个数量的项目。选择器获取用户输入并将其分配给变量val1、val2、val3,其中val1是项目数(行数),val2是项目的名称或标签 PickerViewController.m - (IBAction)add:(id)sender { TableViewControl
- (IBAction)add:(id)sender
{
TableViewController *tvc = [[TableViewController alloc] init];
[tvc setValues:self.val1 :self.val2 :self.val3];
[self presentViewController:tvc animated:YES completion:nil];
}
-(void)setValues:(NSString *)newVal1 :(NSString *)newVal2 :(NSString *)newVal3
{
self.val1 = newVal1;
self.val2 = newVal2;
self.val3 = newVal3;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];
// This is just a header which holds my "Add" button
UIView *header = self.headerView;
[self.tableView setTableHeaderView:header];
[self addNew:self.val1 :self.val2 :self.val3];
}
- (void)addNew:(NSString *)newVal1 :(NSString *)newVal2 :(NSString *)newVal3
{
if(!self.numberOfRows){
NSLog(@"Initially no of rows = %d", self.numberOfRows);
self.numberOfRows = [self.val1 intValue];
NSLog(@"Then no of rows = %d", self.numberOfRows);
}
else
{
self.numberOfRows = self.numberOfRows + [newVal1 intValue];
NSLog(@"New no rows = %d", self.numberOfRows);
}
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.numberOfRows inSection:0];
// Only run when called again .. not initially
if(self.run != 0){
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationBottom];
self.run ++;
[self.tableView endUpdates];
}
}
// "ADD" button which should go back to the picker and get new items to add to the table
- (IBAction)testAdd:(id)sender
{
PickerViewController *pvc = [[PickerViewController alloc] init];
[self presentViewController:pvc animated:YES completion:nil];
}
TableViewController.m
- (IBAction)add:(id)sender
{
TableViewController *tvc = [[TableViewController alloc] init];
[tvc setValues:self.val1 :self.val2 :self.val3];
[self presentViewController:tvc animated:YES completion:nil];
}
-(void)setValues:(NSString *)newVal1 :(NSString *)newVal2 :(NSString *)newVal3
{
self.val1 = newVal1;
self.val2 = newVal2;
self.val3 = newVal3;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"UITableViewCell"];
// This is just a header which holds my "Add" button
UIView *header = self.headerView;
[self.tableView setTableHeaderView:header];
[self addNew:self.val1 :self.val2 :self.val3];
}
- (void)addNew:(NSString *)newVal1 :(NSString *)newVal2 :(NSString *)newVal3
{
if(!self.numberOfRows){
NSLog(@"Initially no of rows = %d", self.numberOfRows);
self.numberOfRows = [self.val1 intValue];
NSLog(@"Then no of rows = %d", self.numberOfRows);
}
else
{
self.numberOfRows = self.numberOfRows + [newVal1 intValue];
NSLog(@"New no rows = %d", self.numberOfRows);
}
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.numberOfRows inSection:0];
// Only run when called again .. not initially
if(self.run != 0){
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationBottom];
self.run ++;
[self.tableView endUpdates];
}
}
// "ADD" button which should go back to the picker and get new items to add to the table
- (IBAction)testAdd:(id)sender
{
PickerViewController *pvc = [[PickerViewController alloc] init];
[self presentViewController:pvc animated:YES completion:nil];
}
现在,我意识到每次调用下一个视图控制器时,我都在创建它的一个新实例,但我不知道如何执行它,我认为这是主要问题。现在,我希望当我离开tableview进入picker视图并返回控制台时,控制台应该记录“newnoofrows=x”,但这并没有发生
我知道val3没有被使用,我的addNew:可能不是最好的,但我只需要它来处理上面提到的基本日志记录,我应该能够从那里获得它
在testAdd中,您已经在这个问题上纠缠了好几天了,您不需要创建新实例并演示它。如果要返回到presentingViewController,只需使用
dismissViewControllerAnimated
您将在堆栈中创建一个控制器。为TableViewController创建一个属性,并且只在第一次显示它时创建它
- (IBAction)add:(id)sender {
if (! self.tvc) {
self.tvc = [[TableViewController alloc] init];
}
[self.tvc setValues:self.val1 :self.val2 :self.val3];
[self presentViewController:self.tvc animated:YES completion:nil];
}
您的问题并不完全清楚,您所谈论的是本演示文稿还是table view类中的演示文稿。看起来您在表示方面也做了一些错误的事情——您从表视图控制器显示了选择器视图,同时也从选择器显示了表视图控制器。这是不正确的,您应该显示希望第二个出现的控制器,并且该控制器应该使用dismissViewControllerAnimated
返回,而不是显示另一个控制器