奇怪的问题加载数据到文本视图字段
问题描述:
简介:大家好,痛苦地通过我的第一个应用程序工作,并找不到解决方案在线这个“加载”的问题。 (a)从表格视图(b)点击单元格(c)推入详细视图,其中从属性列表文件填充文本视图字段。奇怪的问题加载数据到文本视图字段
问题:一切正常(导航栏标题更新,按钮标题更改正确),但文本视图字段空白(默认状态来自IB)...起初。如果我点击后退按钮,然后回到详细视图,文本视图然后正确加载并保持这种方式。完全困惑。
CODE:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// check for view controller
if (self.savedScriptDetailVC ==nil) {
SavedScriptDetailVC *savedScriptDetail =[[SavedScriptDetailVC alloc]initWithNibName:@"SavedScriptDetailView" bundle:nil];
self.savedScriptDetailVC = savedScriptDetail;
[savedScriptDetail release];
}
// find row
NSInteger row = [indexPath row];
//get filepaths and set up arrays for pulling project names and text data
NSString *textPath = [self savedScriptsPath]; //using outside function to get path
NSArray *array = [self savedProjectNames]; //using outside function to pull project names
NSArray *textArray =[[NSArray alloc] initWithContentsOfFile:textPath];
textArray = [textArray valueForKey:@"ScriptText"];
//populate text for textview in detail view. Works, but have to drill down, back out before effect takes, why?-->
savedScriptDetailVC.fScriptText.text = [NSString stringWithFormat:@"%@", [textArray objectAtIndex:row]];
savedScriptDetailVC.title =[NSString stringWithFormat:@"%@", [array objectAtIndex:row]]; //change nav title
//change back button text
UIBarButtonItem *backButton =[[UIBarButtonItem alloc]initWithTitle:@"Scripts" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem =backButton;
[backButton release];
//using delegate to push views
ProjectAppDelegate *delegate =[[UIApplication sharedApplication]delegate];
[delegate.savedScriptsNavC pushViewController:savedScriptDetailVC animated:YES];
}
答
实际视图(及其所有子视图),用于视图控制器未加载直到需要它,即view
属性被访问。因此,在您首先尝试设置文本字段的值时,文本字段不存在,因为视图控制器中没有视图尚未创建。如果你要检查,你会发现savedScriptDetailVC.fScriptText
是零。
一个简单的解决办法是在尝试操纵这些子视图之前访问[savedScriptDetailVC view]
。
答
我同意Anomie的解释:第一次尝试设置文本字段的文本时,文本字段为零,因此没有任何反应。不过,我推荐一个不同的解决方案。为SavedScriptDetailVC提供一个或多个属性,您可以在其中存储执行其任务所需的任何信息,并在将控制器推入导航堆栈之前设置这些属性。让SavedScriptDetailVC负责正确配置其管理的视图,可能在其-viewWillAppear方法中。
通常,应该操纵视图控制器视图的唯一对象是视图控制器。如果你采用这种理念,你将完全避免你现在遇到的那种问题。
+1,这是“正确的”解决方案(与我的快速入侵相反,但不是很好的界面设计)。 – Anomie 2011-03-07 05:45:43
谢谢你们。 Caleb的建议是有道理的,曾经(并且仍然有)麻烦告诉细节视图控制器应该从哪里获取信息。主要是,不知道如何将indexPath行号传递给它。现在我会知道这是要走的路。 – Jalakoo 2011-03-08 06:57:36
你已经做了大概正确的事情。但是,不要将savedScriptDetailVC.fScriptText.text分配给您在此方法中加载的文本,而应为SavedScriptDetailVC指定一个存储路径的属性并设置该属性。当SavedScriptDetailVC加载它的视图时,它可以读取给定路径上的文件并适当地设置其文本视图。同样,如果您认为详细视图控制器需要知道行号,请为该信息创建一个属性并设置它。 – Caleb 2011-03-08 11:40:55