Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何替换视图控制器而不丢失数据_Ios_Objective C_Uitableview - Fatal编程技术网

Ios 如何替换视图控制器而不丢失数据

Ios 如何替换视图控制器而不丢失数据,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

我有两个UIViewController,一个是UIPickerViewController,另一个是UITableViewController。理想情况下,选择器应该从用户那里得到一个请求,向tableView中添加x个数量的项目。选择器获取用户输入并将其分配给变量val1、val2、val3,其中val1是项目数(行数),val2是项目的名称或标签

PickerViewController.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];

}
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
返回,而不是显示另一个控制器