gpt4 book ai didi

ios - Plist 文件不是通过单击一次按钮从 Web 服务创建的,而是在第二次单击时加载的

转载 作者:行者123 更新时间:2023-11-29 02:26:13 25 4
gpt4 key购买 nike

我有一个 View Controller ,它显示了到下一个 View Controller 的segue

但是对于每个连接来显示 Segue 的按钮,要调用的 Web 服务和来自 Web 服务的响应都存储在 plist 文件中并在下一个 View 中访问

我的问题:当我单击按钮时,它会直接进入下一个 View ,而不会第一次加载 plist 内容,但是当我返回并单击按钮时,它会显示 plist 内容

非常感谢任何帮助

这是我的 plist 创建代码,它创建得很好,但是在单击按钮之后

if(connection == conn1)
{
NSError *e = nil;

classResponse = [NSJSONSerialization JSONObjectWithData:classData options:NSJSONReadingMutableLeaves error:&e];
NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"classesArray.plist"];

NSLog(@"file path is %@ ",path);

NSFileManager *fileManager=[NSFileManager defaultManager];

if(![fileManager fileExistsAtPath:path])
{

NSString *bundle = [[[NSBundle mainBundle]resourcePath]stringByAppendingString:@"classesArray.plist"];

//NSString *bundle = [[NSBundle mainBundle]pathForResource:@"create" ofType:@"plist"];

[fileManager copyItemAtPath:bundle toPath:path error:&error];
}
[classResponse writeToFile:path atomically:YES];


}

我在下一个 View 中使用带有自定义单元格的tableview来从plist加载这是我的代码

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [className count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"cellId";
classesTeacher *cell = [tableView
dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];


if (cell == nil) {

cell = [[classesTeacher alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}

long row = [indexPath row];

cell.classname.text = className[row];
cell.classdescription.text = classDescription[row];
cell.classCode.text = classRef[row];
cell.studentcount.text=classIds[row];

return cell;
}

- (void)viewDidLoad {
[super viewDidLoad];


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"classesArray.plist"];


NSDictionary *StudentDict=[[NSDictionary alloc]initWithContentsOfFile:path];

// NSLog(@" QuizDict has %@ ",StudentDict);

//get all values for a key in array

NSArray *See = StudentDict[@"alldata"];

className= [See valueForKey:@"class_name"];
classDescription=[See valueForKey:@"class_description"];
classRef=[See valueForKey:@"class_ref"];
classIds=[See valueForKey:@"number_of_students"];
//classId = [See objectAtIndex:@"classid"];
NSLog(@"class id %@",classId);

NSLog(@"class id is %@",classIds);

UIImage *backImage = [UIImage imageNamed:@"s-left-arrow.png"];
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = CGRectMake(0, 0, backImage.size.width, backImage.size.height);

[backButton setImage:backImage forState:UIControlStateNormal];
[backButton addTarget:self action:@selector(pushBackButton:) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton] ;

self.navigationItem.hidesBackButton = YES;
self.navigationItem.leftBarButtonItem = backBarButtonItem;
[self.table reloadData];
// Do any additional setup after loading the view.
}

最佳答案

这对我来说是一个危险信号,我不明白为什么要将数据存储在 plist 中并稍后访问它,除非您将其用作在两个 View 之间传递数据的方式。

无论如何 - 如果在转换时需要数据时数据不可用,那么您有几个选择:1 - 在转换到新 View 之前获取数据。这将要求您暂停转换,直到返回数据; 2 - 转换到新 View 后获取数据。这将要求您将足够的数据传递给新 View ,以便它可以发出请求。

需要非常小心选项 1。如果您开始请求然后转换到新 View ,第一个 View 的 View Controller 将超出范围,使返回数据无处可去,并可能调用方法不再存在(应用程序崩溃)。

这是一篇关于回调和委托(delegate)的好文章(其中之一)。 delegate function vs callback function

这可以进入第一个或第二个 View Controller ,具体取决于您决定何时获取数据。

如果您将它放在第一个 View Controller 中,您将需要更改您的 segue 并让它手动触发,而不是在按钮上的 Storyboard 中触发。您仍然会在 Storyboard中创建一个 segue,但它不会分配给按钮。一般将它分配给 View ,并确保给它一个 Storyboard名称,以便稍后引用。重新分配按钮操作以触发下载。在回调的完成 block 中(或在委托(delegate)方法中)在数据返回后手动调用 segue。

[self performSegueWithIdentifier: @"YourSegueName" sender: self];

如果您决定在第二个 View Controller 中请求数据,那么您可以使用 prepare for segue 方法将足够的数据传递给该方法以完成数据请求

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"YourSegueName"]) {
YourSecondVC *secondVC = (YourSecondVC *)segue.destinationViewController;
secondVC.dataForRequest= @"request this data;
}

假设您的第二个 View Controller 声明了一个名为“dataForRequest”的 NSString 变量因为此时系统已经创建了第二个 View Controller ,所以您可以使用它来将数据分配给它的成员对象,即使它们是复杂的数据类型。

关于ios - Plist 文件不是通过单击一次按钮从 Web 服务创建的,而是在第二次单击时加载的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com