2011-07-25 40 views
0

所以我想访问并在我的函数外部显示格式化的日期。对于日期格式,我使用NSDateFormatter,它工作正常。NSMutableString访问问题

我的功能(didFinishUpdatesSuccessfully)执行某些操作,如果成功则显示包含格式化日期的UIAlertView。所有这一切工作正常..

- (void) didFinishUpdatesSuccessfully { 

    //--- Create formatted date 
    NSDate *currDate = [NSDate date]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
     [dateFormatter setDateFormat:@"dd/MM/YYYY - hh:mm:ss a"]; 
    NSString *dateString = [dateFormatter stringFromDate:currDate];  // dateString contains the current date as a string 

    [dateFormatter release]; 


    //--- UIAlertView 
    NSString *title = @"The update has been performed!"; 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: title 
                message: dateString 
                delegate: nil 
              cancelButtonTitle: [FileUtils appResourceForKey:@"UPDATE_GENERAL_BUTTON_TITLE_OK"] 
              otherButtonTitles: nil]; 
    [alert show]; 
    [alert release]; 

    //--- create new string 
    // NSMutableString* lastUpdated = [NSMutableString stringWithFormat:@"%@",dateString]; 

} 

我现在想的dateString值写入全球NSStringNSMutableString和访问其他地方的代码,例如其他功能等。

我想过创造一个NSMutableString这样的: NSMutableString* lastUpdated = [NSMutableString stringWithFormat:@"%@",dateString];和访问lastUpdated别的地方,但ouside这个功能lastUpdated是空的......你能帮忙吗?干杯

回答

0
NSMutableString* lastUpdated = [NSMutableString stringWithFormat:@"%@",dateString]; 

如果你这样做,你声明一个名为lastUpdated的本地变量。即使存在另一个具有相同名称的全局变量,只要它在范围内(函数的生命期),本地变量就会隐藏全局变量。

为了使这项工作,你需要在某处声明一个全局lastUpdated任何函数或方法之外,大概接近.m文件的顶部:

NSMutableString *lastUpdated; 

然后,您可以从任何地方在访问该变量.m文件。如果您要访问它在其他.m文件,你要在相应的头文件(.h)添加一个外部声明:

extern NSMutableString *lastUpdated; 

该宣言,你可以在任何文件中使用lastUpdated那包含该头文件。

两件事情知道:

  1. 这是基本的C的东西,所以如果它似乎不熟悉,你应该检讨范围规则C.知道一个全局变量,静态变量,局部之间的区别变量,一个实例变量(好吧,普通老C没有这些)和一个参数。

  2. 全局变量是可怕的。不要相信任何告诉你的人。我提供了上述建议来帮助解决您的即时问题,但更好的解决方案是找出如何重构代码,以避免需要全局变量。 (和国际海事组织单身也不是办法,无论是。单身只是用来访问全局数据并不比花哨的裤子更全局变量。)

+0

感谢您的回复。那么,我真的不喜欢使用全局变量,我同意对此做出的评论......我想要的是保留并显示'lastUpdate'值(在UIAlertView之前的最后一个成功操作的日期触发currentDate(现在),所以用户可以决定不更新,如果它没有意义...我想我可以在'didFinishUpdatesSuccessfully'中添加一个带有标签的子视图。但这里的问题是,标签将被堆叠在一起,具有新的价值......这有意义吗?任何其他想法? – Jan

+0

很难告诉你如何重新组织你的代码,而不需要了解更多信息,比如'-didFinishUpdatesSuccessfully'的存在位置。由于它听起来像一个委托方法,所以我猜测它在视图控制器中。所以,我想你可能想要存储控制器可以访问的最后一次更新的日期(可能是NSUserDefaults)。然后让视图控制器获取日期,将其转换为字符串,并将现有标签的值设置为该字符串。视图控制器负责视图,所以它应该知道如何找到标签。 – Caleb

+0

谢谢Caleb,你猜对了。它是视图控制器中的代表。将值存储在NSUserDefaults中似乎是合理的。我现在必须弄清楚如何做到这一点。任何snippert可用?谢谢 – Jan

0

您应该保留类的字符串。

NSMutableString* lastUpdated; 
lastUpdated = [[NSMutableString stringWithFormat:@"%@",dateString] retain]; 

现在试着在外面访问。

+0

如果这两行意味着彼此相邻,你还没有解决问题。第二行只在方法或函数内部有意义。如果第一行也出现在该方法或函数内,'lastUpdated'是一个局部变量。要使其成为全球性的,第一行必须超出任何方法或功能的范围。然而,你说得对,字符串需要保留。如果字符串是全局的,那么确定谁应该保留字符串以及谁应该释放它是非常棘手的;把这算作是另一个不使用全局的理由。 – Caleb