奇怪的问题加载数据到文本视图字段

问题描述:

简介:大家好,痛苦地通过我的第一个应用程序工作,并找不到解决方案在线这个“加载”的问题。 (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方法中。

通常,应该操纵视图控制器视图的唯一对象是视图控制器。如果你采用这种理念,你将完全避免你现在遇到的那种问题。

+0

+1,这是“正确的”解决方案(与我的快速入侵相反,但不是很好的界面设计)。 – Anomie 2011-03-07 05:45:43

+0

谢谢你们。 Caleb的建议是有道理的,曾经(并且仍然有)麻烦告诉细节视图控制器应该从哪里获取信息。主要是,不知道如何将indexPath行号传递给它。现在我会知道这是要走的路。 – Jalakoo 2011-03-08 06:57:36

+0

你已经做了大概正确的事情。但是,不要将savedScriptDetailVC.fScriptText.text分配给您在此方法中加载的文本,而应为SavedScriptDetailVC指定一个存储路径的属性并设置该属性。当SavedScriptDetailVC加载它的视图时,它可以读取给定路径上的文件并适当地设置其文本视图。同样,如果您认为详细视图控制器需要知道行号,请为该信息创建一个属性并设置它。 – Caleb 2011-03-08 11:40:55